⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entityreferenceimpl.cpp

📁 IBM的解析xml的工具Xerces的源代码
💻 CPP
字号:
/* * Copyright 1999-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: EntityReferenceImpl.cpp,v 1.5 2004/09/08 13:55:43 peiyongz Exp $ *//*** EntityReference models the XML &entityname; syntax, when used for* entities defined by the DOM. Entities hardcoded into XML, such as* character entities, should instead have been translated into text* by the code which generated the DOM tree.* <P>* An XML processor has the alternative of fully expanding Entities* into the normal document tree. If it does so, no EntityReference nodes* will appear.* <P>* Similarly, non-validating XML processors are not required to read* or process entity declarations made in the external subset or* declared in external parameter entities. Hence, some applications* may not make the replacement value available for Parsed Entities* of these types.* <P>* EntityReference behaves as a read-only node, and the children of* the EntityReference (which reflect those of the Entity, and should* also be read-only) give its replacement value, if any. They are* supposed to automagically stay in synch if the DocumentType is* updated with new values for the Entity.* <P>* The defined behavior makes efficient storage difficult for the DOM* implementor. We can't just look aside to the Entity's definition* in the DocumentType since those nodes have the wrong parent (unless* we can come up with a clever "imaginary parent" mechanism). We* must at least appear to clone those children... which raises the* issue of keeping the reference synchronized with its parent.* This leads me back to the "cached image of centrally defined data"* solution, much as I dislike it.* <P>* For now I have decided, since REC-DOM-Level-1-19980818 doesn't* cover this in much detail, that synchronization doesn't have to be* considered while the user is deep in the tree. That is, if you're* looking within one of the EntityReferennce's children and the Entity* changes, you won't be informed; instead, you will continue to access* the same object -- which may or may not still be part of the tree.* This is the same behavior that obtains elsewhere in the DOM if the* subtree you're looking at is deleted from its parent, so it's* acceptable here. (If it really bothers folks, we could set things* up so deleted subtrees are walked and marked invalid, but that's* not part of the DOM's defined behavior.)* <P>* As a result, only the EntityReference itself has to be aware of* changes in the Entity. And it can take advantage of the same* structure-change-monitoring code I implemented to support* DeepNodeList.** @author Rania Y. Khalaf* @author Joseph Kesselman* @since  PR-DOM-Level-1-19980818.*/#include "DocumentImpl.hpp"#include "DocumentTypeImpl.hpp"#include "EntityImpl.hpp"#include "EntityReferenceImpl.hpp"#include "DOM_DOMException.hpp"#include "DOM_Node.hpp"#include "NamedNodeMapImpl.hpp"XERCES_CPP_NAMESPACE_BEGINEntityReferenceImpl::EntityReferenceImpl(DocumentImpl *ownerDoc,                                         const DOMString &entityName)    : ParentNode(ownerDoc){    name = entityName.clone();    // EntityReference behaves as a read-only node, since its contents    // reflect the Entity it refers to -- but see setNodeName().    //retrieve the corresponding entity content    if (ownerDoc) {        if (ownerDoc->getDoctype()) {            if (ownerDoc->getDoctype()->getEntities()) {                EntityImpl* entity = (EntityImpl*)ownerDoc->getDoctype()->getEntities()->getNamedItem(entityName);                if (entity) {                    EntityReferenceImpl* refEntity = entity->getEntityRef();                    if (refEntity)                        cloneChildren(*refEntity);                }            }        }    }    setReadOnly(true, true);}EntityReferenceImpl::EntityReferenceImpl(const EntityReferenceImpl &other,                                         bool deep)    : ParentNode(other){    name = other.name.clone();    if (deep)        cloneChildren(other);    setReadOnly(true, true);}EntityReferenceImpl::~EntityReferenceImpl(){}NodeImpl *EntityReferenceImpl::cloneNode(bool deep){    return new (getOwnerDocument()->getMemoryManager()) EntityReferenceImpl(*this, deep);}DOMString EntityReferenceImpl::getNodeName(){    return name;};short EntityReferenceImpl::getNodeType() {    return DOM_Node::ENTITY_REFERENCE_NODE;};bool EntityReferenceImpl::isEntityReference(){    return true;}/*** EntityRef is already, and must be, a read-only node. Attempts to change* that will throw a NO_MODIFICATION_ALLOWED_ERR DOMException.* <P>* If you want to alter its contents, edit the Entity definition.** @param readOnly boolean*/void EntityReferenceImpl::setReadOnly(bool readOnl,bool deep){    if(getOwnerDocument()->getErrorChecking() && readOnl==false)        throw DOM_DOMException(DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR,null);    ParentNode::setReadOnly(readOnl,deep);}XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

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