home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////
- //
- // Node.cpp
- //
- // This file was generated by XMLSPY 5 Enterprise Edition.
- //
- // YOU SHOULD NOT MODIFY THIS FILE, BECAUSE IT WILL BE
- // OVERWRITTEN WHEN YOU RE-RUN CODE GENERATION.
- //
- // Refer to the XMLSPY Documentation for further details.
- // http://www.altova.com/xmlspy
- //
- ////////////////////////////////////////////////////////////////////////
-
-
- #include "StdAfx.h"
- #include "SchemaTypes.h"
- #include "XmlException.h"
- #include "Node.h"
- #include "Doc.h"
-
-
- namespace altova {
-
-
- //#define ADJUST_LOCAL_NAMES
-
-
- #ifdef ADJUST_LOCAL_NAMES
-
- #define Q2L(x) Q2LHelper(x).GetData()
-
- class Q2LHelper
- {
- public:
- Q2LHelper(const XMLCh* szQName)
- {
- int nPos = xercesc::XMLString::indexOf(szQName, L':');
- if (nPos != -1)
- m_szLocalName = xercesc::XMLString::replicate(szQName + nPos + 1);
- else
- m_szLocalName = xercesc::XMLString::replicate(szQName);
- }
-
- ~Q2LHelper()
- {
- xercesc::XMLString::release(&m_szLocalName);
- }
-
- const XMLCh* GetData() const
- {
- return m_szLocalName;
- }
-
- protected:
- XMLCh* m_szLocalName;
- };
-
- #else
-
- #define Q2L(x) x
-
- #endif
-
-
- CNode::CNode()
- {
- m_pDOMNode = CDoc::CreateFragment();
- }
-
-
- CNode::CNode(xercesc::DOMNode* pThisNode)
- {
- m_pDOMNode = pThisNode;
- }
-
-
- CNode::CNode(xercesc::DOMDocument* pDOMDocument)
- {
- m_pDOMNode = pDOMDocument->getDocumentElement();
- }
-
-
- CNode::~CNode()
- {
- CDoc::ReleaseFragment(m_pDOMNode);
- }
-
-
- tstring CNode::GetNodeName()
- {
- return XC2TS(m_pDOMNode->getNodeName());
- }
-
-
- tstring CNode::GetNodeValue()
- {
- return XC2TS(m_pDOMNode->getNodeValue());
- }
-
-
- xercesc::DOMNode* CNode::GetDOMNode()
- {
- return m_pDOMNode;
- }
-
-
- void CNode::MapPrefix(const tstring& sPrefix, const tstring& sURI)
- {
- if (sURI.empty())
- return;
-
- xercesc::DOMElement* pElement = reinterpret_cast<xercesc::DOMElement*>(m_pDOMNode);
- tstring sTmp;
-
- if (sPrefix.empty())
- sTmp = _T("xmlns");
- else
- sTmp = _T("xmlns:") + sPrefix;
-
- pElement->setAttribute(X(sTmp), X(sURI));
- }
-
-
- tstring CNode::InternalGetNodeValue(ENodeType eNodeType, xercesc::DOMNode* pNode)
- {
- if (pNode == NULL)
- return _T("");
- if (eNodeType == Element)
- return XC2TS(pNode->getFirstChild()->getNodeValue());
- else
- return XC2TS(pNode->getNodeValue());
- }
-
-
- tstring CNode::InternalGetElementValue()
- {
- //return m_pDOMNode->getTextContent();
- return InternalGetNodeValue(Element, m_pDOMNode);
- }
-
-
- void CNode::InternalSetElementValue(const tstring& sValue)
- {
- m_pDOMNode->setTextContent(X(sValue));
- }
-
-
- bool CNode::InternalNamesMatch(xercesc::DOMNode* pNode, const tstring& sNamespaceURI, const tstring& sName)
- {
- tstring sNodeURI;
- tstring sNodeName;
- if (pNode->getNamespaceURI())
- sNodeURI = XC2TS(pNode->getNamespaceURI());
- if (pNode->getLocalName())
- sNodeName = XC2TS(pNode->getLocalName());
- return sNamespaceURI == sNodeURI && sName == sNodeName;
- }
-
-
- int CNode::ChildCountInternal(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName)
- {
- if (eNodeType == Element)
- {
- int nCount = 0;
-
- for (xercesc::DOMNode* pNode = m_pDOMNode->getFirstChild(); pNode != NULL; pNode = pNode->getNextSibling())
- if (InternalNamesMatch(pNode, sNamespaceURI, sName))
- nCount++;
-
- return nCount;
- }
- else
- return (static_cast<xercesc::DOMElement*>(m_pDOMNode))->hasAttributeNS(X(sNamespaceURI), Q2L(X(sName))) ? 1 : 0;
- }
-
-
- bool CNode::InternalHasChild(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName)
- {
- if (eNodeType == Element)
- {
- for (xercesc::DOMNode* pNode = m_pDOMNode->getFirstChild(); pNode != NULL; pNode = pNode->getNextSibling())
- if (InternalNamesMatch(pNode, sNamespaceURI, sName))
- return true;
-
- return false;
- }
- else
- return (static_cast<xercesc::DOMElement*>(m_pDOMNode))->hasAttributeNS(X(sNamespaceURI), Q2L(X(sName)));
- }
-
-
- xercesc::DOMNode* CNode::InternalCreate(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName, const tstring& sValue)
- {
- if (eNodeType == Element)
- {
- xercesc::DOMElement* pElement = m_pDOMNode->getOwnerDocument()->createElementNS(X(sNamespaceURI), X(sName));
- pElement->appendChild(m_pDOMNode->getOwnerDocument()->createTextNode(X(sValue)));
- return pElement;
- }
- else
- {
- xercesc::DOMAttr* pAttribute = m_pDOMNode->getOwnerDocument()->createAttributeNS(X(sNamespaceURI), X(sName));
- pAttribute->setNodeValue(X(sValue));
- return pAttribute;
- }
- }
-
-
- xercesc::DOMNode* CNode::InternalAppend(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName, const tstring& sValue)
- {
- if (eNodeType == Element)
- return m_pDOMNode->appendChild(InternalCreate(eNodeType, sNamespaceURI, sName, sValue));
- else
- return m_pDOMNode->getAttributes()->setNamedItemNS(InternalCreate(eNodeType, sNamespaceURI, sName, sValue));
- }
-
-
- xercesc::DOMNode* CNode::InternalAppendNode(const tstring& sNamespaceURI, const tstring& sName, CNode& rNode)
- {
- xercesc::DOMNode* pOldNode = rNode.m_pDOMNode;
- rNode.m_pDOMNode = m_pDOMNode->appendChild(InternalAdopt(rNode.m_pDOMNode, sNamespaceURI, sName));
- CDoc::ReleaseFragment(pOldNode);
- return rNode.m_pDOMNode;
- }
-
-
- xercesc::DOMNode* CNode::InternalGetAt(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName, int nIndex)
- {
- if (eNodeType == Element)
- {
- int nCount = 0;
-
- for (xercesc::DOMNode* pNode = m_pDOMNode->getFirstChild(); pNode != NULL; pNode = pNode->getNextSibling())
- if (InternalNamesMatch(pNode, sNamespaceURI, sName))
- if (nCount++ == nIndex)
- return pNode;
-
- throw std::exception("Index out of range");
- }
- else
- {
- xercesc::DOMAttr* pAttr = static_cast<xercesc::DOMAttr*>(m_pDOMNode->getAttributes()->getNamedItemNS(X(sNamespaceURI), Q2L(X(sName))));
- if (pAttr != NULL)
- return pAttr;
- else
- throw std::exception("Index out of range");
- }
- }
-
-
- xercesc::DOMNode* CNode::InternalGet(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName)
- {
- return InternalGetAt(eNodeType, sNamespaceURI, sName, 0);
- }
-
-
- xercesc::DOMNode* CNode::InternalInsertAt(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName, int nIndex, const tstring& sValue)
- {
- if (eNodeType == Element)
- return m_pDOMNode->insertBefore(
- InternalCreate(eNodeType, sNamespaceURI, sName, sValue),
- InternalGetAt(eNodeType, sNamespaceURI, sName, nIndex)
- );
- else
- return InternalAppend(eNodeType, sNamespaceURI, sName, sValue);
- }
-
-
- xercesc::DOMNode* CNode::InternalInsertNodeAt(const tstring& sNamespaceURI, const tstring& sName, int nIndex, CNode& rNode)
- {
- rNode.m_pDOMNode = m_pDOMNode->insertBefore(
- InternalAdopt(rNode.m_pDOMNode, sNamespaceURI, sName),
- InternalGetAt(Element, sNamespaceURI, sName, nIndex)
- );
-
- return rNode.m_pDOMNode;
- }
-
-
- xercesc::DOMNode* CNode::InternalReplaceAt(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName, int nIndex, const tstring& sValue)
- {
- if (eNodeType == Element)
- return m_pDOMNode->replaceChild(
- InternalCreate(eNodeType, sNamespaceURI, sName, sValue),
- InternalGetAt(eNodeType, sNamespaceURI, sName, nIndex)
- );
- else
- return InternalAppend(eNodeType, sNamespaceURI, sName, sValue);
- }
-
-
- xercesc::DOMNode* CNode::InternalReplaceNodeAt(const tstring& sNamespaceURI, const tstring& sName, int nIndex, CNode& rNode)
- {
- xercesc::DOMNode* pOldNode = rNode.m_pDOMNode;
- rNode.m_pDOMNode = m_pDOMNode->replaceChild(
- InternalAdopt(rNode.m_pDOMNode, sNamespaceURI, sName),
- InternalGetAt(Element, sNamespaceURI, sName, nIndex)
- );
- CDoc::ReleaseFragment(pOldNode);
-
- return rNode.m_pDOMNode;
- }
-
-
- xercesc::DOMNode* CNode::InternalRemoveAt(ENodeType eNodeType, const tstring& sNamespaceURI, const tstring& sName, int nIndex)
- {
- if (eNodeType == Element)
- return m_pDOMNode->removeChild(InternalGetAt(eNodeType, sNamespaceURI, sName, nIndex));
- else
- return m_pDOMNode->getAttributes()->removeNamedItemNS(X(sNamespaceURI), Q2L(X(sName)));
- }
-
-
- xercesc::DOMElement* CNode::InternalAdopt(xercesc::DOMNode* pElement, const tstring& sNamespaceURI, const tstring& sName)
- {
- xercesc::DOMDocument* pDoc = m_pDOMNode->getOwnerDocument();
- xercesc::DOMElement* pNewElement = pDoc->createElementNS(X(sNamespaceURI), X(sName));
-
- while (xercesc::DOMNode* pNode = pElement->getFirstChild())
- {
- pNewElement->appendChild(pDoc->importNode(pNode, true));
- pElement->removeChild(pNode);
- }
-
- xercesc::DOMNamedNodeMap* pSrcAttributes = pElement->getAttributes();
- xercesc::DOMNamedNodeMap* pDstAttributes = pNewElement->getAttributes();
- while (pSrcAttributes->getLength() > 0)
- {
- xercesc::DOMNode* pNode = pSrcAttributes->item(0);
- pDstAttributes->setNamedItemNS(pDoc->importNode(pNode, true));
- pSrcAttributes->removeNamedItemNS(pNode->getNamespaceURI(), Q2L(pNode->getLocalName()));
- }
-
- return pNewElement;
- }
-
-
- void CNode::DeclareNamespace(xercesc::DOMElement* pElement, const tstring& sPrefix, const tstring& sURI)
- {
- if (sURI.empty())
- return;
-
- tstring sTmp;
-
- if (sPrefix.empty())
- sTmp = _T("xmlns");
- else
- sTmp = _T("xmlns:") + sPrefix;
-
- xercesc::DOMNamedNodeMap* pAttrs = pElement->getAttributes();
- for (int i = 0; i < pAttrs->getLength(); i++)
- {
- xercesc::DOMAttr* pAttr = reinterpret_cast<xercesc::DOMAttr*>(pAttrs->item(i));
- if (xercesc::XMLString::equals(pAttr->getValue(), X(sURI)))
- return;
- }
-
- pElement->setAttribute(X(sTmp), X(sURI));
- }
-
-
- const XMLCh* CNode::LookupPrefix(xercesc::DOMNode* pNode, const XMLCh* szURI)
- {
- if (pNode == NULL)
- return NULL;
-
- if (szURI == NULL || *szURI == 0)
- return NULL;
-
- if (pNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE)
- {
- xercesc::DOMNamedNodeMap* pAttrs = pNode->getAttributes();
- if (pAttrs != NULL)
- {
- XMLSize_t len = pAttrs->getLength();
- for (int i = 0; i < len; i++)
- {
- xercesc::DOMAttr* pAttr = reinterpret_cast<xercesc::DOMAttr*>(pAttrs->item(i));
- const XMLCh* szName = pAttr->getName();
- const XMLCh* szValue = pAttr->getValue();
- if (xercesc::XMLString::equals(szValue, szURI))
- {
- if (xercesc::XMLString::stringLen(szName) < 6)
- return NULL;
- else
- return szName + 6;
- }
- }
- }
- return LookupPrefix(pNode->getParentNode(), szURI);
- }
- else if (pNode->getNodeType() == xercesc::DOMNode::ATTRIBUTE_NODE)
- {
- return LookupPrefix(reinterpret_cast<xercesc::DOMAttr*>(pNode)->getOwnerElement(), szURI);
- }
- else
- {
- return NULL;
- }
- }
-
-
- void CNode::InternalAdjustPrefix(xercesc::DOMNode* pDOMNode, bool bQualified)
- {
- if (pDOMNode != NULL && bQualified)
- {
- const XMLCh* szPrefix = LookupPrefix(pDOMNode, pDOMNode->getNamespaceURI());
- if (szPrefix)
- pDOMNode->setPrefix(szPrefix);
- }
- }
-
-
- } // namespace altova
-