domnamednodemapimpl.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 338 行

CPP
338
字号
/* * Copyright 2001-2002,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Id: DOMNamedNodeMapImpl.cpp,v 1.14 2004/09/08 13:55:51 peiyongz Exp $ */#include <xercesc/dom/DOMAttr.hpp>#include <xercesc/dom/DOMException.hpp>#include <xercesc/framework/XMLBuffer.hpp>#include <xercesc/util/XMLUniDefs.hpp>#include "DOMNodeVector.hpp"#include "DOMNamedNodeMapImpl.hpp"#include "DOMCasts.hpp"#include "DOMDocumentImpl.hpp"#include "DOMNodeImpl.hpp"XERCES_CPP_NAMESPACE_BEGINDOMNamedNodeMapImpl::DOMNamedNodeMapImpl(DOMNode *ownerNod){    fOwnerNode=ownerNod;    memset(fBuckets,0,MAP_SIZE*sizeof(DOMNodeVector*));}DOMNamedNodeMapImpl::~DOMNamedNodeMapImpl(){}bool DOMNamedNodeMapImpl::readOnly() {    return castToNodeImpl(fOwnerNode)->isReadOnly();}DOMNamedNodeMapImpl *DOMNamedNodeMapImpl::cloneMap(DOMNode *ownerNod){    DOMDocumentImpl *doc = (DOMDocumentImpl *)(castToNodeImpl(ownerNod)->getOwnerDocument());    DOMNamedNodeMapImpl *newmap = new (doc) DOMNamedNodeMapImpl(ownerNod);	    for(int index=0;index<MAP_SIZE;index++)        if (fBuckets[index] != 0) {            XMLSize_t size=fBuckets[index]->size();            newmap->fBuckets[index] = new (doc) DOMNodeVector(doc, size);            for (XMLSize_t i = 0; i < size; ++i) {                DOMNode *s = fBuckets[index]->elementAt(i);                DOMNode *n = s->cloneNode(true);			    castToNodeImpl(n)->isSpecified(castToNodeImpl(s)->isSpecified());                castToNodeImpl(n)->fOwnerNode = ownerNod;                castToNodeImpl(n)->isOwned(true);                newmap->fBuckets[index]->addElement(n);            }        }    return newmap;}XMLSize_t DOMNamedNodeMapImpl::getLength() const{    XMLSize_t count=0;    for(int index=0;index<MAP_SIZE;index++)        count+=(fBuckets[index]==0?0:fBuckets[index]->size());    return count;}DOMNode * DOMNamedNodeMapImpl::item(XMLSize_t index) const{    XMLSize_t count=0;    for(XMLSize_t i=0;i<MAP_SIZE;i++) {        if(fBuckets[i]==0)            continue;        XMLSize_t thisBucket=fBuckets[i]->size();        if(index>=count && index<(count+thisBucket))            return fBuckets[i]->elementAt(index-count);        count+=thisBucket;    }    return NULL;}DOMNode * DOMNamedNodeMapImpl::getNamedItem(const XMLCh *name) const{    unsigned int hash=XMLString::hash(name,MAP_SIZE);    if(fBuckets[hash]==0)        return 0;    int i = 0;    int size = fBuckets[hash]->size();    for (i = 0; i < size; ++i) {        DOMNode *n=fBuckets[hash]->elementAt(i);        if(XMLString::equals(name,n->getNodeName()))            return n;    }    return 0;}//// removeNamedItem() - Remove the named item, and return it.//                      The caller can release the//                      returned item if it's not used//                      we can't do it here because the caller would//                      never see the returned node.//DOMNode * DOMNamedNodeMapImpl::removeNamedItem(const XMLCh *name){    if (this->readOnly())        throw DOMException(            DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMNamedNodeMapMemoryManager);        unsigned int hash=XMLString::hash(name,MAP_SIZE);    if(fBuckets[hash]==0)        throw DOMException(DOMException::NOT_FOUND_ERR, 0, GetDOMNamedNodeMapMemoryManager);    int i = 0;    int size = fBuckets[hash]->size();    for (i = 0; i < size; ++i) {        DOMNode *n=fBuckets[hash]->elementAt(i);        if(XMLString::equals(name,n->getNodeName())) {            fBuckets[hash]->removeElementAt(i);            castToNodeImpl(n)->fOwnerNode = fOwnerNode->getOwnerDocument();            castToNodeImpl(n)->isOwned(false);            return n;        }    }    throw DOMException(DOMException::NOT_FOUND_ERR, 0, GetDOMNamedNodeMapMemoryManager);    return 0;}//// setNamedItem()  Put the item into the NamedNodeList by name.//                  If an item with the same name already was//                  in the list, replace it.  Return the old//                  item, if there was one.//                  Caller is responsible for arranging for//                  deletion of the old item if its ref count is//                  zero.//DOMNode * DOMNamedNodeMapImpl::setNamedItem(DOMNode * arg){    DOMDocument *doc = fOwnerNode->getOwnerDocument();    DOMNodeImpl *argImpl = castToNodeImpl(arg);    if(argImpl->getOwnerDocument() != doc)        throw DOMException(DOMException::WRONG_DOCUMENT_ERR,0, GetDOMNamedNodeMapMemoryManager);    if (this->readOnly())        throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMNamedNodeMapMemoryManager);    if ((arg->getNodeType() == DOMNode::ATTRIBUTE_NODE) && argImpl->isOwned() && (argImpl->fOwnerNode != fOwnerNode))        throw DOMException(DOMException::INUSE_ATTRIBUTE_ERR,0, GetDOMNamedNodeMapMemoryManager);    argImpl->fOwnerNode = fOwnerNode;    argImpl->isOwned(true);    const XMLCh* name=arg->getNodeName();    unsigned int hash=XMLString::hash(name,MAP_SIZE);    if(fBuckets[hash]==0)        fBuckets[hash] = new (doc) DOMNodeVector(doc, 3);    int i = 0;    int size = fBuckets[hash]->size();    for (i = 0; i < size; ++i) {        DOMNode *n=fBuckets[hash]->elementAt(i);        if(XMLString::equals(name,n->getNodeName())) {            fBuckets[hash]->setElementAt(arg,i);            castToNodeImpl(n)->fOwnerNode = fOwnerNode->getOwnerDocument();            castToNodeImpl(n)->isOwned(false);            return n;        }    }    fBuckets[hash]->addElement(arg);    return 0;}void DOMNamedNodeMapImpl::setReadOnly(bool readOnl, bool deep){    // this->fReadOnly=readOnl;    if(deep) {        for (int index = 0; index < MAP_SIZE; index++) {            if(fBuckets[index]==0)                continue;            int sz = fBuckets[index]->size();            for (int i=0; i<sz; ++i)                castToNodeImpl(fBuckets[index]->elementAt(i))->setReadOnly(readOnl, deep);        }    }}//Introduced in DOM Level 2DOMNode *DOMNamedNodeMapImpl::getNamedItemNS(const XMLCh *namespaceURI, const XMLCh *localName) const{    // the map is indexed using the full name of nodes; to search given a namespace and a local name    // we have to do a linear search    for (int index = 0; index < MAP_SIZE; index++) {        if(fBuckets[index]==0)            continue;        int i = 0;        int size = fBuckets[index]->size();        for (i = 0; i < size; ++i) {            DOMNode *n=fBuckets[index]->elementAt(i);            const XMLCh * nNamespaceURI = n->getNamespaceURI();            const XMLCh * nLocalName = n->getLocalName();            if (!XMLString::equals(nNamespaceURI, namespaceURI))    //URI not match                continue;            else {                if (XMLString::equals(localName, nLocalName)                    ||                    (nLocalName == 0 && XMLString::equals(localName, n->getNodeName())))                    return n;            }        }    }    return 0;}//// setNamedItemNS()  Put the item into the NamedNodeList by name.//                  If an item with the same name already was//                  in the list, replace it.  Return the old//                  item, if there was one.//                  Caller is responsible for arranging for//                  deletion of the old item if its ref count is//                  zero.//DOMNode * DOMNamedNodeMapImpl::setNamedItemNS(DOMNode *arg){    DOMDocument *doc = fOwnerNode->getOwnerDocument();    DOMNodeImpl *argImpl = castToNodeImpl(arg);    if (argImpl->getOwnerDocument() != doc)        throw DOMException(DOMException::WRONG_DOCUMENT_ERR,0, GetDOMNamedNodeMapMemoryManager);    if (this->readOnly())        throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMNamedNodeMapMemoryManager);    if (argImpl->isOwned())        throw DOMException(DOMException::INUSE_ATTRIBUTE_ERR,0, GetDOMNamedNodeMapMemoryManager);    argImpl->fOwnerNode = fOwnerNode;    argImpl->isOwned(true);    const XMLCh* namespaceURI=arg->getNamespaceURI();    const XMLCh* localName=arg->getLocalName();    // the map is indexed using the full name of nodes; to search given a namespace and a local name    // we have to do a linear search    for (int index = 0; index < MAP_SIZE; index++) {        if(fBuckets[index]==0)            continue;        int i = 0;        int size = fBuckets[index]->size();        for (i = 0; i < size; ++i) {            DOMNode *n=fBuckets[index]->elementAt(i);            const XMLCh * nNamespaceURI = n->getNamespaceURI();            const XMLCh * nLocalName = n->getLocalName();            if (!XMLString::equals(nNamespaceURI, namespaceURI))    //URI not match                continue;            else {                if (XMLString::equals(localName, nLocalName)                    ||                    (nLocalName == 0 && XMLString::equals(localName, n->getNodeName()))) {                    fBuckets[index]->setElementAt(arg,i);                    castToNodeImpl(n)->fOwnerNode = fOwnerNode->getOwnerDocument();                    castToNodeImpl(n)->isOwned(false);                    return n;                }            }        }    }    // if not found, add it using the full name as key    return setNamedItem(arg);}// removeNamedItemNS() - Remove the named item, and return it.//                      The caller can release the//                      returned item if it's not used//                      we can't do it here because the caller would//                      never see the returned node.DOMNode *DOMNamedNodeMapImpl::removeNamedItemNS(const XMLCh *namespaceURI,                                                 const XMLCh *localName){    if (this->readOnly())        throw DOMException(        DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMNamedNodeMapMemoryManager);    // the map is indexed using the full name of nodes; to search given a namespace and a local name    // we have to do a linear search    for (int index = 0; index < MAP_SIZE; index++) {        if(fBuckets[index]==0)            continue;        int i = 0;        int size = fBuckets[index]->size();        for (i = 0; i < size; ++i) {            DOMNode *n=fBuckets[index]->elementAt(i);            const XMLCh * nNamespaceURI = n->getNamespaceURI();            const XMLCh * nLocalName = n->getLocalName();            if (!XMLString::equals(nNamespaceURI, namespaceURI))    //URI not match                continue;            else {                if (XMLString::equals(localName, nLocalName)                    ||                    (nLocalName == 0 && XMLString::equals(localName, n->getNodeName()))) {                    fBuckets[index]->removeElementAt(i);                    castToNodeImpl(n)->fOwnerNode = fOwnerNode->getOwnerDocument();                    castToNodeImpl(n)->isOwned(false);                    return n;                }            }        }    }    throw DOMException(DOMException::NOT_FOUND_ERR, 0, GetDOMNamedNodeMapMemoryManager);    return 0;}XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?