DOMElementImpl.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:24k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Id: DOMElementImpl.cpp,v 1.20 2003/05/16 06:01:50 knoaman Exp $
  58.  */
  59. #include "DOMElementImpl.hpp"
  60. #include <xercesc/dom/DOMAttr.hpp>
  61. #include <xercesc/dom/DOMDocument.hpp>
  62. #include <xercesc/dom/DOMException.hpp>
  63. #include <xercesc/util/XMLUniDefs.hpp>
  64. #include <xercesc/util/XMLUri.hpp>
  65. #include "DOMAttrMapImpl.hpp"
  66. #include "DOMAttrImpl.hpp"
  67. #include "DOMDocumentImpl.hpp"
  68. #include "DOMParentNode.hpp"
  69. #include "DOMStringPool.hpp"
  70. #include "DOMCasts.hpp"
  71. #include "DOMElementNSImpl.hpp"
  72. #include "DOMTypeInfoImpl.hpp"
  73. #include "DOMDeepNodeListImpl.hpp"
  74. #include "DOMDocumentTypeImpl.hpp"
  75. #include "DOMNamedNodeMapImpl.hpp"
  76. XERCES_CPP_NAMESPACE_BEGIN
  77. class DOMAttr;
  78. DOMElementImpl::DOMElementImpl(DOMDocument *ownerDoc, const XMLCh *eName)
  79.     : fNode(ownerDoc), fParent(ownerDoc), fAttributes(0), fDefaultAttributes(0), fSchemaType(0)
  80. {
  81.     DOMDocumentImpl *docImpl = (DOMDocumentImpl *)ownerDoc;
  82.     fName = docImpl->getPooledString(eName);
  83.     setupDefaultAttributes();
  84.     if (!fDefaultAttributes) {
  85.         fDefaultAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this);
  86.         fAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this);
  87.     }
  88.     else {
  89.         fAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this, fDefaultAttributes);
  90.     }
  91. };
  92. DOMElementImpl::DOMElementImpl(const DOMElementImpl &other, bool deep)
  93.     : fNode(other.getOwnerDocument()),
  94.       fParent(other.getOwnerDocument()),
  95.       fSchemaType(other.fSchemaType),
  96.       fAttributes(0),
  97.       fDefaultAttributes(0)
  98. {
  99.     fName = other.fName;
  100.     if (deep)
  101.         fParent.cloneChildren(&other);
  102.     if (other.getAttributes())
  103.     {
  104.         fAttributes = ((DOMAttrMapImpl *)other.getAttributes())->cloneAttrMap(this);
  105.     }
  106.     if (other.getDefaultAttributes())
  107.     {
  108.         fDefaultAttributes = ((DOMAttrMapImpl *)other.getDefaultAttributes())->cloneAttrMap(this);
  109.     }
  110.     if (!fDefaultAttributes)
  111.         setupDefaultAttributes();
  112.     if (!fDefaultAttributes)
  113.         fDefaultAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this);
  114.     if (!fAttributes) {
  115.         if (!fDefaultAttributes) {
  116.             fAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this);
  117.         }
  118.         else {
  119.             fAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this, fDefaultAttributes);
  120.         }
  121.     }
  122. };
  123. DOMElementImpl::~DOMElementImpl()
  124. {
  125. };
  126. DOMNode *DOMElementImpl::cloneNode(bool deep) const
  127. {
  128.     DOMNode* newNode = new (getOwnerDocument(), DOMDocumentImpl::ELEMENT_OBJECT) DOMElementImpl(*this, deep);
  129.     fNode.callUserDataHandlers(DOMUserDataHandler::NODE_CLONED, this, newNode);
  130.     return newNode;
  131. };
  132. const XMLCh * DOMElementImpl::getNodeName() const {
  133.     return fName;
  134. };
  135. short DOMElementImpl::getNodeType() const {
  136.     return DOMNode::ELEMENT_NODE;
  137. };
  138. const XMLCh * DOMElementImpl::getAttribute(const XMLCh *nam) const
  139. {
  140.     static const XMLCh emptyString[]  = {0};
  141.     DOMNode * attr=0;
  142.     attr=fAttributes->getNamedItem(nam);
  143.     const XMLCh *retString = emptyString;
  144.     if (attr != 0)
  145.         retString = attr->getNodeValue();
  146.     return retString;
  147. };
  148. DOMAttr *DOMElementImpl::getAttributeNode(const XMLCh *nam) const
  149. {
  150.     return  (DOMAttr *)fAttributes->getNamedItem(nam);
  151. };
  152. DOMNamedNodeMap *DOMElementImpl::getAttributes() const
  153. {
  154.     DOMElementImpl *ncThis = (DOMElementImpl *)this;   // cast off const
  155.     return ncThis->fAttributes;
  156. };
  157. DOMNodeList *DOMElementImpl::getElementsByTagName(const XMLCh *tagname) const
  158. {
  159.     DOMDocumentImpl *docImpl = (DOMDocumentImpl *)getOwnerDocument();
  160.     return docImpl->getDeepNodeList(this,tagname);
  161. };
  162. const XMLCh * DOMElementImpl::getTagName() const
  163. {
  164.     return fName;
  165. }
  166. void DOMElementImpl::removeAttribute(const XMLCh *nam)
  167. {
  168.     if (fNode.isReadOnly())
  169.         throw DOMException(
  170.              DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  171.     XMLSSize_t i = fAttributes->findNamePoint(nam);
  172.     if (i >= 0)
  173.     {
  174.         DOMNode *att = fAttributes->removeNamedItemAt(i);
  175.         ((DOMAttrImpl *)att)->removeAttrFromIDNodeMap();
  176.         att->release();
  177.     }
  178. };
  179. DOMAttr *DOMElementImpl::removeAttributeNode(DOMAttr *oldAttr)
  180. {
  181.     if (fNode.isReadOnly())
  182.         throw DOMException(
  183.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  184.     DOMNode* found = 0;
  185.     // Since there is no removeAttributeNodeNS, check if this oldAttr has NS or not
  186.     const XMLCh* localName = oldAttr->getLocalName();
  187.     XMLSSize_t i = 0;
  188.     if (localName)
  189.         i = fAttributes->findNamePoint(oldAttr->getNamespaceURI(), localName);
  190.     else
  191.         i = fAttributes->findNamePoint(oldAttr->getName());
  192.     if (i >= 0) {
  193.         // If it is in fact the right object, remove it.
  194.         found = fAttributes->item(i);
  195.         if (found == oldAttr) {
  196.             fAttributes->removeNamedItemAt(i);
  197.             ((DOMAttrImpl *)oldAttr)->removeAttrFromIDNodeMap();
  198.         }
  199.         else
  200.             throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  201.     }
  202.     else
  203.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  204.    return (DOMAttr *)found;
  205. };
  206. void DOMElementImpl::setAttribute(const XMLCh *nam, const XMLCh *val)
  207. {
  208.     if (fNode.isReadOnly())
  209.         throw DOMException(
  210.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  211.     DOMAttr* newAttr = getAttributeNode(nam);
  212.     if (!newAttr)
  213.     {
  214.         newAttr = this->fNode.getOwnerDocument()->createAttribute(nam);
  215.         fAttributes->setNamedItem(newAttr);
  216.     }
  217.     newAttr->setNodeValue(val);
  218. };
  219. void DOMElementImpl::setIdAttribute(const XMLCh* name)
  220. {
  221.     if (fNode.isReadOnly())
  222.         throw DOMException(
  223.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  224.     DOMAttr *attr = getAttributeNode(name);
  225.     if (!attr) 
  226.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  227.     ((DOMAttrImpl *)attr)->addAttrToIDNodeMap();
  228. };
  229. void DOMElementImpl::setIdAttributeNS(const XMLCh* namespaceURI, const XMLCh* localName) {
  230.     if (fNode.isReadOnly())
  231.         throw DOMException(
  232.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  233.     DOMAttr *attr = getAttributeNodeNS(namespaceURI, localName);
  234.     if (!attr) 
  235.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  236.     ((DOMAttrImpl *)attr)->addAttrToIDNodeMap();
  237. };
  238. void DOMElementImpl::setIdAttributeNode(const DOMAttr *idAttr) {
  239.     if (fNode.isReadOnly())
  240.         throw DOMException(
  241.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  242.     DOMAttr *attr;
  243.     const XMLCh* localName = idAttr->getLocalName();
  244.     if (localName)
  245.         attr = getAttributeNodeNS(idAttr->getNamespaceURI(), idAttr->getLocalName());
  246.     else 
  247.         attr = getAttributeNode(idAttr->getName());
  248.     
  249.     if(!attr) 
  250.         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
  251.     ((DOMAttrImpl *)attr)->addAttrToIDNodeMap();
  252. };
  253. DOMAttr * DOMElementImpl::setAttributeNode(DOMAttr *newAttr)
  254. {
  255.     if (fNode.isReadOnly())
  256.         throw DOMException(
  257.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  258.     if (newAttr->getNodeType() != DOMNode::ATTRIBUTE_NODE)
  259.         throw DOMException(DOMException::WRONG_DOCUMENT_ERR, 0);
  260.         // revisit.  Exception doesn't match test.
  261.     // This will throw INUSE if necessary
  262.     DOMAttr *oldAttr = (DOMAttr *) fAttributes->setNamedItem(newAttr);
  263.     return oldAttr;
  264. };
  265. void DOMElementImpl::setNodeValue(const XMLCh *x)
  266. {
  267.     fNode.setNodeValue(x);
  268. };
  269. void DOMElementImpl::setReadOnly(bool readOnl, bool deep)
  270. {
  271.     fNode.setReadOnly(readOnl,deep);
  272.     fAttributes->setReadOnly(readOnl,true);
  273. };
  274. //Introduced in DOM Level 2
  275. const XMLCh * DOMElementImpl::getAttributeNS(const XMLCh *fNamespaceURI,
  276.     const XMLCh *fLocalName) const
  277. {
  278.     DOMAttr * attr=
  279.       (DOMAttr *)(fAttributes->getNamedItemNS(fNamespaceURI, fLocalName));
  280.     return (attr==0) ? XMLUni::fgZeroLenString : attr->getValue();
  281. }
  282. void DOMElementImpl::setAttributeNS(const XMLCh *fNamespaceURI,
  283.     const XMLCh *qualifiedName, const XMLCh *fValue)
  284. {
  285.     if (fNode.isReadOnly())
  286.         throw DOMException(
  287.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  288.     DOMAttr* newAttr = getAttributeNodeNS(fNamespaceURI, qualifiedName);
  289.     if (!newAttr)
  290.     {
  291.         newAttr = this->fNode.getOwnerDocument()->createAttributeNS(fNamespaceURI, qualifiedName);
  292.         fAttributes->setNamedItemNS(newAttr);
  293.     }
  294.     newAttr->setNodeValue(fValue);
  295. }
  296. void DOMElementImpl::removeAttributeNS(const XMLCh *fNamespaceURI,
  297.     const XMLCh *fLocalName)
  298. {
  299.     if (fNode.isReadOnly())
  300.         throw DOMException(
  301.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  302.     XMLSSize_t i = fAttributes->findNamePoint(fNamespaceURI, fLocalName);
  303.     if (i >= 0)
  304.     {
  305.         DOMNode *att = fAttributes->removeNamedItemAt(i);
  306.         att->release();
  307.     }
  308. }
  309. DOMAttr *DOMElementImpl::getAttributeNodeNS(const XMLCh *fNamespaceURI,
  310.     const XMLCh *fLocalName) const
  311. {
  312.     return (DOMAttr *)fAttributes->getNamedItemNS(fNamespaceURI, fLocalName);
  313. }
  314. DOMAttr *DOMElementImpl::setAttributeNodeNS(DOMAttr *newAttr)
  315. {
  316.     if (fNode.isReadOnly())
  317.         throw DOMException(
  318.             DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  319.     if (newAttr -> getOwnerDocument() != this -> getOwnerDocument())
  320.         throw DOMException(DOMException::WRONG_DOCUMENT_ERR, 0);
  321.     // This will throw INUSE if necessary
  322.     DOMAttr *oldAttr = (DOMAttr *) fAttributes->setNamedItemNS(newAttr);
  323.     return oldAttr;
  324. }
  325. DOMNodeList *DOMElementImpl::getElementsByTagNameNS(const XMLCh *namespaceURI,
  326.     const XMLCh *localName) const
  327. {
  328.     DOMDocumentImpl *docImpl = (DOMDocumentImpl *)getOwnerDocument();;
  329.     return docImpl->getDeepNodeList(this, namespaceURI, localName);
  330. }
  331. bool DOMElementImpl::hasAttributes() const
  332. {
  333.     return (fAttributes != 0 && fAttributes->getLength() != 0);
  334. };
  335. bool DOMElementImpl::hasAttribute(const XMLCh *name) const
  336. {
  337.     return (getAttributeNode(name) != 0);
  338. };
  339. bool DOMElementImpl::hasAttributeNS(const XMLCh *namespaceURI,
  340.     const XMLCh *localName) const
  341. {
  342.     return (getAttributeNodeNS(namespaceURI, localName) != 0);
  343. };
  344. // util functions for default attributes
  345. // returns the default attribute map for this node from the owner document
  346. DOMAttrMapImpl *DOMElementImpl::getDefaultAttributes() const
  347. {
  348.     return fDefaultAttributes;
  349. }
  350. // initially set up the default attribute information based on doctype information
  351. void DOMElementImpl::setupDefaultAttributes()
  352. {
  353.     DOMDocument *tmpdoc = getOwnerDocument();
  354.     if ((fNode.fOwnerNode == 0) || (tmpdoc == 0) || (tmpdoc->getDoctype() == 0))
  355.         return;
  356.     DOMNode *eldef = ((DOMDocumentTypeImpl*)tmpdoc->getDoctype())->getElements()->getNamedItem(getNodeName());
  357.     DOMAttrMapImpl* defAttrs = (eldef == 0) ? 0 : (DOMAttrMapImpl *)(eldef->getAttributes());
  358.     if (defAttrs)
  359.         fDefaultAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this, defAttrs);
  360. }
  361. DOMAttr * DOMElementImpl::setDefaultAttributeNode(DOMAttr *newAttr)
  362. {
  363.     if (fNode.isReadOnly())
  364.         throw DOMException(
  365.         DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  366.     if (newAttr->getNodeType() != DOMNode::ATTRIBUTE_NODE)
  367.         throw DOMException(DOMException::WRONG_DOCUMENT_ERR, 0);
  368.         // revisit.  Exception doesn't match test.
  369.     // This will throw INUSE if necessary
  370.     DOMAttr *oldAttr = (DOMAttr *) fDefaultAttributes->setNamedItem(newAttr);
  371.     fAttributes->hasDefaults(true);
  372.     return oldAttr;
  373. };
  374. DOMAttr *DOMElementImpl::setDefaultAttributeNodeNS(DOMAttr *newAttr)
  375. {
  376.     if (fNode.isReadOnly())
  377.         throw DOMException(
  378.             DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
  379.     if (newAttr -> getOwnerDocument() != this -> getOwnerDocument())
  380.         throw DOMException(DOMException::WRONG_DOCUMENT_ERR, 0);
  381.     // This will throw INUSE if necessary
  382.     DOMAttr *oldAttr = (DOMAttr *) fDefaultAttributes->setNamedItemNS(newAttr);
  383.     fAttributes->hasDefaults(true);
  384.     return oldAttr;
  385. }
  386. void DOMElementImpl::release()
  387. {
  388.     if (fNode.isOwned() && !fNode.isToBeReleased())
  389.         throw DOMException(DOMException::INVALID_ACCESS_ERR,0);
  390.     DOMDocumentImpl* doc = (DOMDocumentImpl*) getOwnerDocument();
  391.     if (doc) {
  392.         fNode.callUserDataHandlers(DOMUserDataHandler::NODE_DELETED, 0, 0);
  393.         fParent.release();
  394.         doc->release(this, DOMDocumentImpl::ELEMENT_OBJECT);
  395.     }
  396.     else {
  397.         // shouldn't reach here
  398.         throw DOMException(DOMException::INVALID_ACCESS_ERR,0);
  399.     }
  400. }
  401. const XMLCh* DOMElementImpl::getBaseURI() const
  402. {
  403.     const XMLCh* baseURI = fNode.fOwnerNode->getBaseURI();
  404.     if (fAttributes) {
  405.         const XMLCh xmlBaseString[] =
  406.         {
  407.             chLatin_x, chLatin_m, chLatin_l, chColon, chLatin_b, chLatin_a, chLatin_s, chLatin_e, chNull
  408.         };
  409.         DOMNode* attrNode = fAttributes->getNamedItem(xmlBaseString);
  410.         if (attrNode) {
  411.             const XMLCh* uri =  attrNode->getNodeValue();
  412.             if (uri && *uri) {// attribute value is always empty string
  413.                 try {
  414.                     XMLUri temp(baseURI, ((DOMDocumentImpl *)this->getOwnerDocument())->getMemoryManager());
  415.                     XMLUri temp2(&temp, uri, ((DOMDocumentImpl *)this->getOwnerDocument())->getMemoryManager());
  416.                     uri = ((DOMDocumentImpl *)this->getOwnerDocument())->cloneString(temp2.getUriText());
  417.                 }
  418.                 catch (...){
  419.                     // REVISIT: what should happen in this case?
  420.                     return 0;
  421.                 }
  422.                 return uri;
  423.             }
  424.         }
  425.     }
  426.     return baseURI;
  427. }
  428. //
  429. //   Functions inherited from Node
  430. //
  431.            DOMNode*         DOMElementImpl::appendChild(DOMNode *newChild)          {return fParent.appendChild (newChild); };
  432.            DOMNodeList*     DOMElementImpl::getChildNodes() const                   {return fParent.getChildNodes (); };
  433.            DOMNode*         DOMElementImpl::getFirstChild() const                   {return fParent.getFirstChild (); };
  434.            DOMNode*         DOMElementImpl::getLastChild() const                    {return fParent.getLastChild (); };
  435.      const XMLCh*           DOMElementImpl::getLocalName() const                    {return fNode.getLocalName (); };
  436.      const XMLCh*           DOMElementImpl::getNamespaceURI() const                 {return fNode.getNamespaceURI (); };
  437.            DOMNode*         DOMElementImpl::getNextSibling() const                  {return fChild.getNextSibling (); };
  438.      const XMLCh*           DOMElementImpl::getNodeValue() const                    {return fNode.getNodeValue (); };
  439.            DOMDocument*     DOMElementImpl::getOwnerDocument() const                {return fParent.fOwnerDocument; };
  440.      const XMLCh*           DOMElementImpl::getPrefix() const                       {return fNode.getPrefix (); };
  441.            DOMNode*         DOMElementImpl::getParentNode() const                   {return fChild.getParentNode (this); };
  442.            DOMNode*         DOMElementImpl::getPreviousSibling() const              {return fChild.getPreviousSibling (this); };
  443.            bool             DOMElementImpl::hasChildNodes() const                   {return fParent.hasChildNodes (); };
  444.            DOMNode*         DOMElementImpl::insertBefore(DOMNode *newChild, DOMNode *refChild)
  445.                                                                                     {return fParent.insertBefore (newChild, refChild); };
  446.            void             DOMElementImpl::normalize()                             {fParent.normalize (); };
  447.            DOMNode*         DOMElementImpl::removeChild(DOMNode *oldChild)          {return fParent.removeChild (oldChild); };
  448.            DOMNode*         DOMElementImpl::replaceChild(DOMNode *newChild, DOMNode *oldChild)
  449.                                                                                     {return fParent.replaceChild (newChild, oldChild); };
  450.            bool             DOMElementImpl::isSupported(const XMLCh *feature, const XMLCh *version) const
  451.                                                                                     {return fNode.isSupported (feature, version); };
  452.            void             DOMElementImpl::setPrefix(const XMLCh  *prefix)         {fNode.setPrefix(prefix); };
  453.            bool             DOMElementImpl::isSameNode(const DOMNode* other) const  {return fNode.isSameNode(other); };
  454.            void*            DOMElementImpl::setUserData(const XMLCh* key, void* data, DOMUserDataHandler* handler)
  455.                                                                                     {return fNode.setUserData(key, data, handler); };
  456.            void*            DOMElementImpl::getUserData(const XMLCh* key) const     {return fNode.getUserData(key); };
  457.            short            DOMElementImpl::compareTreePosition(const DOMNode* other) const {return fNode.compareTreePosition(other); };
  458.            const XMLCh*     DOMElementImpl::getTextContent() const                  {return fNode.getTextContent(); };
  459.            void             DOMElementImpl::setTextContent(const XMLCh* textContent){fNode.setTextContent(textContent); };
  460.            const XMLCh*     DOMElementImpl::lookupNamespacePrefix(const XMLCh* namespaceURI, bool useDefault) const  {return fNode.lookupNamespacePrefix(namespaceURI, useDefault); };
  461.            bool             DOMElementImpl::isDefaultNamespace(const XMLCh* namespaceURI) const {return fNode.isDefaultNamespace(namespaceURI); };
  462.            const XMLCh*     DOMElementImpl::lookupNamespaceURI(const XMLCh* prefix) const  {return fNode.lookupNamespaceURI(prefix); };
  463.            DOMNode*         DOMElementImpl::getInterface(const XMLCh* feature)      {return fNode.getInterface(feature); };
  464. bool DOMElementImpl::isEqualNode(const DOMNode* arg) const
  465. {
  466.     if (isSameNode(arg)) {
  467.         return true;
  468.     }
  469.     if (!fNode.isEqualNode(arg)) {
  470.         return false;
  471.     }
  472.     bool hasAttrs = hasAttributes();
  473.     if (hasAttrs != arg->hasAttributes()) {
  474.         return false;
  475.     }
  476.     if (hasAttrs) {
  477.         DOMNamedNodeMap* map1 = getAttributes();
  478.         DOMNamedNodeMap* map2 = arg->getAttributes();
  479.         XMLSize_t len = map1->getLength();
  480.         if (len != map2->getLength()) {
  481.             return false;
  482.         }
  483.         for (XMLSize_t i = 0; i < len; i++) {
  484.             DOMNode* n1 = map1->item(i);
  485.             if (!n1->getLocalName()) { // DOM Level 1 Node
  486.                 DOMNode* n2 = map2->getNamedItem(n1->getNodeName());
  487.                 if (!n2 || !n1->isEqualNode(n2)) {
  488.                     return false;
  489.                 }
  490.             }
  491.             else {
  492.                 DOMNode* n2 = map2->getNamedItemNS(n1->getNamespaceURI(),
  493.                                               n1->getLocalName());
  494.                 if (!n2 || !n1->isEqualNode(n2)) {
  495.                     return false;
  496.                 }
  497.             }
  498.         }
  499.     }
  500.     return fParent.isEqualNode(arg);
  501. };
  502. DOMNode* DOMElementImpl::rename(const XMLCh* namespaceURI, const XMLCh* name)
  503. {
  504.     DOMDocumentImpl* doc = (DOMDocumentImpl*) getOwnerDocument();
  505.     if (!namespaceURI || !*namespaceURI) {
  506.         fName = doc->getPooledString(name);
  507.         fAttributes->reconcileDefaultAttributes(getDefaultAttributes());
  508.         return this;
  509.     }
  510.     else {
  511.         // create a new ElementNS
  512.         DOMElementNSImpl* newElem = (DOMElementNSImpl*)doc->createElementNS(namespaceURI, name);
  513.         // transfer the userData
  514.         doc->transferUserData(castToNodeImpl(this), castToNodeImpl(newElem));
  515.         // remove old node from parent if any
  516.         DOMNode* parent = getParentNode();
  517.         DOMNode* nextSib = getNextSibling();
  518.         if (parent) {
  519.             parent->removeChild(this);
  520.         }
  521.         // move children to new node
  522.         DOMNode* child = getFirstChild();
  523.         while (child) {
  524.             removeChild(child);
  525.             newElem->appendChild(child);
  526.             child = getFirstChild();
  527.         }
  528.         // insert new node where old one was
  529.         if (parent) {
  530.             parent->insertBefore(newElem, nextSib);
  531.         }
  532.         // move specified attributes to new node
  533.         newElem->fAttributes->moveSpecifiedAttributes(fAttributes);
  534.         // and fire user data NODE_RENAMED event
  535.         castToNodeImpl(newElem)->callUserDataHandlers(DOMUserDataHandler::NODE_RENAMED, this, newElem);
  536.         return newElem;
  537.     }
  538. }
  539. const DOMTypeInfo *DOMElementImpl::getTypeInfo() const
  540. {
  541.     if(!fSchemaType) 
  542.         ((DOMElementImpl *)(this))->fSchemaType = new (getOwnerDocument()) DOMTypeInfoImpl(0, 0, (DOMDocumentImpl *)getOwnerDocument());
  543.     return fSchemaType;
  544. }
  545. void DOMElementImpl::setTypeInfo(const XMLCh* typeName, const XMLCh* typeURI) 
  546. {
  547.     fSchemaType = new (getOwnerDocument()) DOMTypeInfoImpl(typeName, typeURI, (DOMDocumentImpl *)getOwnerDocument());
  548. }
  549. XERCES_CPP_NAMESPACE_END