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

📄 element.cpp

📁 C++ class libraries for network-centric, portable applications, integrated perfectly with the C++ St
💻 CPP
字号:
//// Element.cpp//// $Id: //poco/1.2/XML/src/Element.cpp#2 $//// Library: XML// Package: DOM// Module:  DOM//// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.// and Contributors.//// Permission is hereby granted, free of charge, to any person or organization// obtaining a copy of the software and accompanying documentation covered by// this license (the "Software") to use, reproduce, display, distribute,// execute, and transmit the Software, and to prepare derivative works of the// Software, and to permit third-parties to whom the Software is furnished to// do so, all subject to the following:// // The copyright notices in the Software and this entire statement, including// the above license grant, this restriction and the following disclaimer,// must be included in all copies of the Software, in whole or in part, and// all derivative works of the Software, unless such copies or derivative// works are solely in the form of machine-executable object code generated by// a source language processor.// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER// DEALINGS IN THE SOFTWARE.//#include "Poco/DOM/Element.h"#include "Poco/DOM/Document.h"#include "Poco/DOM/Attr.h"#include "Poco/DOM/DOMException.h"#include "Poco/DOM/ElementsByTagNameList.h"#include "Poco/DOM/Text.h"#include "Poco/DOM/AttrMap.h"namespace Poco {namespace XML {Element::Element(Document* pOwnerDocument, const XMLString& namespaceURI, const XMLString& localName, const XMLString& qname):	AbstractContainerNode(pOwnerDocument),	_name(pOwnerDocument->namePool().insert(qname, namespaceURI, localName)),	_pFirstAttr(0){}Element::Element(Document* pOwnerDocument, const Element& element): 	AbstractContainerNode(pOwnerDocument, element),	_name(pOwnerDocument->namePool().insert(element._name)),	_pFirstAttr(0){	Attr* pAttr = element._pFirstAttr;	while (pAttr)	{		Attr* pClonedAttr = static_cast<Attr*>(pAttr->copyNode(false, pOwnerDocument));		setAttributeNode(pClonedAttr);		pClonedAttr->release();		pAttr = static_cast<Attr*>(pAttr->_pNext);	}}Element::~Element(){	if (_pFirstAttr) _pFirstAttr->release();}const XMLString& Element::getAttribute(const XMLString& name) const{	Attr* pAttr = getAttributeNode(name);	if (pAttr)		return pAttr->getValue();	else		return EMPTY_STRING;}void Element::setAttribute(const XMLString& name, const XMLString& value){	Attr* pAttr = getAttributeNode(name);	if (pAttr)	{		pAttr->setValue(value);	}	else	{		pAttr = ownerDocument()->createAttribute(name);		pAttr->setValue(value);		setAttributeNode(pAttr);		pAttr->release();	}}void Element::removeAttribute(const XMLString& name){	Attr* pAttr = getAttributeNode(name);	if (pAttr) removeAttributeNode(pAttr);}Attr* Element::getAttributeNode(const XMLString& name) const{	Attr* pAttr = _pFirstAttr;	while (pAttr && pAttr->_name.qname() != name) pAttr = static_cast<Attr*>(pAttr->_pNext);	return pAttr;}Attr* Element::setAttributeNode(Attr* newAttr){	poco_check_ptr (newAttr);	if (newAttr->ownerDocument() != ownerDocument())		throw DOMException(DOMException::WRONG_DOCUMENT_ERR);	if (newAttr->ownerElement())		throw DOMException(DOMException::INUSE_ATTRIBUTE_ERR);	Attr* oldAttr = getAttributeNode(newAttr->name());	if (oldAttr) removeAttributeNode(oldAttr);	Attr* pCur = _pFirstAttr;	if (pCur)	{		while (pCur->_pNext) pCur = static_cast<Attr*>(pCur->_pNext);		pCur->_pNext = newAttr;	}	else _pFirstAttr = newAttr;	newAttr->duplicate();	newAttr->_pParent = this;	if (_pOwner->events())		dispatchAttrModified(newAttr, MutationEvent::ADDITION, EMPTY_STRING, newAttr->getValue());	return oldAttr;}Attr* Element::removeAttributeNode(Attr* oldAttr){	poco_check_ptr (oldAttr);	if (_pOwner->events()) 		dispatchAttrModified(oldAttr, MutationEvent::REMOVAL, oldAttr->getValue(), EMPTY_STRING);	if (oldAttr != _pFirstAttr)	{		Attr* pCur = _pFirstAttr;		while (pCur->_pNext != oldAttr) pCur = static_cast<Attr*>(pCur->_pNext);		if (pCur)		{			pCur->_pNext = static_cast<Attr*>(pCur->_pNext->_pNext);		}		else throw DOMException(DOMException::NOT_FOUND_ERR);	}	else _pFirstAttr = static_cast<Attr*>(_pFirstAttr->_pNext);	oldAttr->_pNext   = 0;	oldAttr->_pParent = 0;	oldAttr->autoRelease();	return oldAttr;}NodeList* Element::getElementsByTagName(const XMLString& name) const{	return new ElementsByTagNameList(this, name);}NodeList* Element::getElementsByTagNameNS(const XMLString& namespaceURI, const XMLString& localName) const{	return new ElementsByTagNameListNS(this, namespaceURI, localName);}void Element::normalize(){	Node* pCur = firstChild();	while (pCur)	{		if (pCur->nodeType() == Node::ELEMENT_NODE)		{			pCur->normalize();		}		else if (pCur->nodeType() == Node::TEXT_NODE)		{			Node* pNext = pCur->nextSibling();			while (pNext && pNext->nodeType() == Node::TEXT_NODE)			{				static_cast<Text*>(pCur)->appendData(pNext->nodeValue());				removeChild(pNext);				pNext = pCur->nextSibling();			}		}		pCur = pCur->nextSibling();	}}const XMLString& Element::nodeName() const{	return tagName();}NamedNodeMap* Element::attributes() const{	return new AttrMap(const_cast<Element*>(this));}unsigned short Element::nodeType() const{	return Node::ELEMENT_NODE;}const XMLString& Element::getAttributeNS(const XMLString& namespaceURI, const XMLString& localName) const{	Attr* pAttr = getAttributeNodeNS(namespaceURI, localName);	if (pAttr)		return pAttr->getValue();	else		return EMPTY_STRING;}void Element::setAttributeNS(const XMLString& namespaceURI, const XMLString& qualifiedName, const XMLString& value){	Attr* pAttr = getAttributeNodeNS(namespaceURI, qualifiedName);	if (pAttr)	{		pAttr->setValue(value);	}	else	{		pAttr = _pOwner->createAttributeNS(namespaceURI, qualifiedName);		pAttr->setValue(value);		setAttributeNodeNS(pAttr);		pAttr->release();	}}void Element::removeAttributeNS(const XMLString& namespaceURI, const XMLString& localName){	Attr* pAttr = getAttributeNodeNS(namespaceURI, localName);	if (pAttr) removeAttributeNode(pAttr);}Attr* Element::getAttributeNodeNS(const XMLString& namespaceURI, const XMLString& localName) const{	Attr* pAttr = _pFirstAttr;	while (pAttr && (pAttr->_name.namespaceURI() != namespaceURI || pAttr->_name.localName() != localName)) pAttr = static_cast<Attr*>(pAttr->_pNext);	return pAttr;}Attr* Element::setAttributeNodeNS(Attr* newAttr){	poco_check_ptr (newAttr);	if (newAttr->ownerDocument() != ownerDocument())		throw DOMException(DOMException::WRONG_DOCUMENT_ERR);	if (newAttr->ownerElement())		throw DOMException(DOMException::INUSE_ATTRIBUTE_ERR);	Attr* oldAttr = getAttributeNodeNS(newAttr->namespaceURI(), newAttr->localName());	if (oldAttr) removeAttributeNode(oldAttr);	Attr* pCur = _pFirstAttr;	if (pCur)	{		while (pCur->_pNext) pCur = static_cast<Attr*>(pCur->_pNext);		pCur->_pNext = newAttr;	}	else _pFirstAttr = newAttr;	newAttr->_pParent = this;	newAttr->duplicate();	if (_pOwner->events())		dispatchAttrModified(newAttr, MutationEvent::ADDITION, EMPTY_STRING, newAttr->getValue());	return oldAttr;}bool Element::hasAttribute(const XMLString& name) const{	return getAttributeNode(name) != 0;}bool Element::hasAttributeNS(const XMLString& namespaceURI, const XMLString& localName) const{	return getAttributeNodeNS(namespaceURI, localName) != 0;}const XMLString& Element::namespaceURI() const{	return _name.namespaceURI();}XMLString Element::prefix() const{	return _name.prefix();}const XMLString& Element::localName() const{	return _name.localName();}bool Element::hasAttributes() const{	return _pFirstAttr != 0;}XMLString Element::innerText() const{	XMLString result;	Node* pChild = firstChild();	while (pChild)	{		result.append(pChild->innerText());		pChild = pChild->nextSibling();	}	return result;}Element* Element::getChildElement(const XMLString& name) const{	Node* pNode = firstChild();	while (pNode && !(pNode->nodeType() == Node::ELEMENT_NODE && pNode->nodeName() == name))		pNode = pNode->nextSibling();	return static_cast<Element*>(pNode);}Element* Element::getChildElementNS(const XMLString& namespaceURI, const XMLString& localName) const{	Node* pNode = firstChild();	while (pNode && !(pNode->nodeType() == Node::ELEMENT_NODE && pNode->namespaceURI() == namespaceURI && pNode->localName() == localName))		pNode = pNode->nextSibling();	return static_cast<Element*>(pNode);}void Element::dispatchNodeRemovedFromDocument(){	AbstractContainerNode::dispatchNodeRemovedFromDocument();	Attr* pAttr = _pFirstAttr;	while (pAttr)	{		pAttr->dispatchNodeRemovedFromDocument();		pAttr = static_cast<Attr*>(pAttr->_pNext);	}}void Element::dispatchNodeInsertedIntoDocument(){	AbstractContainerNode::dispatchNodeInsertedIntoDocument();	Attr* pAttr = _pFirstAttr;	while (pAttr)	{		pAttr->dispatchNodeInsertedIntoDocument();		pAttr = static_cast<Attr*>(pAttr->_pNext);	}}Node* Element::copyNode(bool deep, Document* pOwnerDocument) const{	Element* pClone = new Element(pOwnerDocument, *this);	if (deep)	{		Node* pNode = firstChild();		while (pNode)		{			pClone->appendChild(static_cast<AbstractNode*>(pNode)->copyNode(true, pOwnerDocument))->release();			pNode = pNode->nextSibling();		}	}	return pClone;}Element* Element::getElementById(const XMLString& elementId, const XMLString& idAttribute) const{	if (getAttribute(idAttribute) == elementId)		return const_cast<Element*>(this);	Node* pNode = firstChild();	while (pNode)	{		if (pNode->nodeType() == Node::ELEMENT_NODE)		{			Element* pResult = static_cast<Element*>(pNode)->getElementById(elementId, idAttribute);			if (pResult) return pResult;		}		pNode = pNode->nextSibling();	}	return 0;}Element* Element::getElementByIdNS(const XMLString& elementId, const XMLString& idAttributeURI, const XMLString& idAttributeLocalName) const{	if (getAttributeNS(idAttributeURI, idAttributeLocalName) == elementId)		return const_cast<Element*>(this);	Node* pNode = firstChild();	while (pNode)	{		if (pNode->nodeType() == Node::ELEMENT_NODE)		{			Element* pResult = static_cast<Element*>(pNode)->getElementByIdNS(elementId, idAttributeURI, idAttributeLocalName);			if (pResult) return pResult;		}		pNode = pNode->nextSibling();	}	return 0;}} } // namespace Poco::XML

⌨️ 快捷键说明

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