mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-22 08:02:06 +02:00
changes from main repository
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// AttributesImpl.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/AttributesImpl.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/AttributesImpl.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
@@ -43,18 +43,23 @@ namespace XML {
|
||||
|
||||
AttributesImpl::AttributesImpl()
|
||||
{
|
||||
_empty.specified = false;
|
||||
_empty.type = "CDATA";
|
||||
}
|
||||
|
||||
|
||||
AttributesImpl::AttributesImpl(const Attributes& attributes)
|
||||
{
|
||||
_empty.specified = false;
|
||||
_empty.type = "CDATA";
|
||||
setAttributes(attributes);
|
||||
}
|
||||
|
||||
|
||||
AttributesImpl::AttributesImpl(const AttributesImpl& attributes)
|
||||
AttributesImpl::AttributesImpl(const AttributesImpl& attributes):
|
||||
_attributes(attributes._attributes),
|
||||
_empty(attributes._empty)
|
||||
{
|
||||
setAttributes(attributes);
|
||||
}
|
||||
|
||||
|
||||
@@ -99,114 +104,6 @@ int AttributesImpl::getIndex(const XMLString& namespaceURI, const XMLString& loc
|
||||
}
|
||||
|
||||
|
||||
int AttributesImpl::getLength() const
|
||||
{
|
||||
return (int) _attributes.size();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getLocalName(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].localName;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getQName(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].qname;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getType(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].type;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getType(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->type;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getType(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->type;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getValue(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].value;
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getValue(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->value;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getValue(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->value;
|
||||
else
|
||||
return XMLString();
|
||||
}
|
||||
|
||||
|
||||
XMLString AttributesImpl::getURI(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].namespaceURI;
|
||||
}
|
||||
|
||||
|
||||
bool AttributesImpl::isSpecified(int i) const
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
return _attributes[i].specified;
|
||||
}
|
||||
|
||||
|
||||
bool AttributesImpl::isSpecified(const XMLString& qname) const
|
||||
{
|
||||
Attribute* pAttr = find(qname);
|
||||
if (pAttr)
|
||||
return pAttr->specified;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool AttributesImpl::isSpecified(const XMLString& namespaceURI, const XMLString& localName) const
|
||||
{
|
||||
Attribute* pAttr = find(namespaceURI, localName);
|
||||
if (pAttr)
|
||||
return pAttr->specified;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void AttributesImpl::setValue(int i, const XMLString& value)
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
@@ -346,6 +243,12 @@ void AttributesImpl::clear()
|
||||
}
|
||||
|
||||
|
||||
void AttributesImpl::reserve(std::size_t capacity)
|
||||
{
|
||||
_attributes.reserve(capacity);
|
||||
}
|
||||
|
||||
|
||||
void AttributesImpl::setLocalName(int i, const XMLString& localName)
|
||||
{
|
||||
poco_assert (i < _attributes.size());
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// DOMBuilder.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/DOMBuilder.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/DOMBuilder.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
@@ -126,6 +126,28 @@ Document* DOMBuilder::parse(InputSource* pInputSource)
|
||||
}
|
||||
|
||||
|
||||
Document* DOMBuilder::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
setupParse();
|
||||
_pDocument->suspendEvents();
|
||||
try
|
||||
{
|
||||
_xmlReader.parseMemoryNP(xml, size);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
_pDocument->release();
|
||||
_pDocument = 0;
|
||||
_pParent = 0;
|
||||
_pPrevious = 0;
|
||||
throw;
|
||||
}
|
||||
_pDocument->resumeEvents();
|
||||
_pDocument->collectGarbage();
|
||||
return _pDocument;
|
||||
}
|
||||
|
||||
|
||||
void DOMBuilder::setupParse()
|
||||
{
|
||||
_pDocument = new Document(_pNamePool);
|
||||
@@ -191,13 +213,11 @@ void DOMBuilder::startElement(const XMLString& uri, const XMLString& localName,
|
||||
AutoPtr<Element> pElem = _namespaces ? _pDocument->createElementNS(uri, qname.empty() ? localName : qname) : _pDocument->createElement(qname);
|
||||
|
||||
const AttributesImpl& attrs = dynamic_cast<const AttributesImpl&>(attributes);
|
||||
Attr* pPrevAttr = 0;
|
||||
for (AttributesImpl::iterator it = attrs.begin(); it != attrs.end(); ++it)
|
||||
{
|
||||
AutoPtr<Attr> pAttr = new Attr(_pDocument, 0, it->namespaceURI, it->localName, it->qname, it->value, it->specified);
|
||||
if (_namespaces)
|
||||
pElem->setAttributeNodeNS(pAttr);
|
||||
else
|
||||
pElem->setAttributeNode(pAttr);
|
||||
pPrevAttr = pElem->addAttributeNodeNP(pPrevAttr, pAttr);
|
||||
}
|
||||
appendNode(pElem);
|
||||
_pParent = pElem;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// DOMParser.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/DOMParser.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/DOMParser.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
@@ -135,9 +135,23 @@ Document* DOMParser::parse(InputSource* pInputSource)
|
||||
|
||||
Document* DOMParser::parseString(const std::string& xml)
|
||||
{
|
||||
std::istringstream istr(xml);
|
||||
InputSource src(istr);
|
||||
return parse(&src);
|
||||
return parseMemory(xml.data(), xml.size());
|
||||
}
|
||||
|
||||
|
||||
Document* DOMParser::parseMemory(const char* xml, std::size_t size)
|
||||
{
|
||||
if (_whitespace)
|
||||
{
|
||||
DOMBuilder builder(_saxParser, _pNamePool);
|
||||
return builder.parseMemoryNP(xml, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WhitespaceFilter filter(&_saxParser);
|
||||
DOMBuilder builder(filter, _pNamePool);
|
||||
return builder.parseMemoryNP(xml, size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// DOMSerializer.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/DOMSerializer.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/DOMSerializer.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
@@ -199,6 +199,12 @@ void DOMSerializer::parse(const XMLString& systemId)
|
||||
}
|
||||
|
||||
|
||||
void DOMSerializer::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
throw XMLException("The DOMSerializer cannot parse from memory");
|
||||
}
|
||||
|
||||
|
||||
void DOMSerializer::iterate(const Node* pNode) const
|
||||
{
|
||||
while (pNode)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// Element.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/Element.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/Element.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: DOM
|
||||
@@ -173,6 +173,27 @@ Attr* Element::removeAttributeNode(Attr* oldAttr)
|
||||
}
|
||||
|
||||
|
||||
Attr* Element::addAttributeNodeNP(Attr* oldAttr, Attr* newAttr)
|
||||
{
|
||||
newAttr->_pParent = this;
|
||||
if (oldAttr)
|
||||
{
|
||||
oldAttr->_pNext = newAttr;
|
||||
}
|
||||
else if (_pFirstAttr)
|
||||
{
|
||||
newAttr->_pNext = _pFirstAttr;
|
||||
_pFirstAttr = newAttr;
|
||||
}
|
||||
else
|
||||
{
|
||||
_pFirstAttr = newAttr;
|
||||
}
|
||||
newAttr->duplicate();
|
||||
return newAttr;
|
||||
}
|
||||
|
||||
|
||||
NodeList* Element::getElementsByTagName(const XMLString& name) const
|
||||
{
|
||||
return new ElementsByTagNameList(this, name);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// NamespaceStrategy.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/NamespaceStrategy.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/NamespaceStrategy.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: XML
|
||||
@@ -46,8 +46,6 @@ namespace XML {
|
||||
|
||||
|
||||
const XMLString NamespaceStrategy::NOTHING;
|
||||
const XMLString NamespaceStrategy::CDATA = toXMLString("CDATA");
|
||||
const XMLString NamespaceStrategy::COLON = toXMLString(":");
|
||||
|
||||
|
||||
NamespaceStrategy::~NamespaceStrategy()
|
||||
@@ -83,13 +81,21 @@ void NamespaceStrategy::splitName(const XMLChar* qname, XMLString& uri, XMLStrin
|
||||
localName.assign(loc, p - loc);
|
||||
if (*p)
|
||||
prefix.assign(++p);
|
||||
else
|
||||
prefix.assign("");
|
||||
}
|
||||
else localName = qname;
|
||||
else
|
||||
{
|
||||
uri.assign("");
|
||||
localName = qname;
|
||||
prefix.assign("");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NoNamespacesStrategy::NoNamespacesStrategy()
|
||||
{
|
||||
_attrs.reserve(32);
|
||||
}
|
||||
|
||||
|
||||
@@ -102,14 +108,16 @@ void NoNamespacesStrategy::startElement(const XMLChar* name, const XMLChar** att
|
||||
{
|
||||
poco_assert_dbg (name && atts && pContentHandler);
|
||||
|
||||
AttributesImpl attributes;
|
||||
_attrs.clear();
|
||||
for (int i = 0; *atts; ++i)
|
||||
{
|
||||
const XMLChar* attrName = *atts++;
|
||||
const XMLChar* attrValue = *atts++;
|
||||
attributes.addAttribute(NOTHING, NOTHING, attrName, CDATA, attrValue, i < specifiedCount);
|
||||
AttributesImpl::Attribute& attr = _attrs.addAttribute();
|
||||
attr.qname.assign(*atts++);
|
||||
attr.value.assign(*atts++);
|
||||
attr.specified = i < specifiedCount;
|
||||
}
|
||||
pContentHandler->startElement(NOTHING, NOTHING, name, attributes);
|
||||
_name.assign(name);
|
||||
pContentHandler->startElement(NOTHING, NOTHING, _name, _attrs);
|
||||
}
|
||||
|
||||
|
||||
@@ -117,12 +125,14 @@ void NoNamespacesStrategy::endElement(const XMLChar* name, ContentHandler* pCont
|
||||
{
|
||||
poco_assert_dbg (name && pContentHandler);
|
||||
|
||||
pContentHandler->endElement(NOTHING, NOTHING, name);
|
||||
_name.assign(name);
|
||||
pContentHandler->endElement(NOTHING, NOTHING, _name);
|
||||
}
|
||||
|
||||
|
||||
NoNamespacePrefixesStrategy::NoNamespacePrefixesStrategy()
|
||||
{
|
||||
_attrs.reserve(32);
|
||||
}
|
||||
|
||||
|
||||
@@ -135,20 +145,18 @@ void NoNamespacePrefixesStrategy::startElement(const XMLChar* name, const XMLCha
|
||||
{
|
||||
poco_assert_dbg (name && atts && pContentHandler);
|
||||
|
||||
AttributesImpl attributes;
|
||||
_attrs.clear();
|
||||
for (int i = 0; *atts; ++i)
|
||||
{
|
||||
const XMLChar* attrName = *atts++;
|
||||
const XMLChar* attrValue = *atts++;
|
||||
XMLString attrURI;
|
||||
XMLString attrLocal;
|
||||
splitName(attrName, attrURI, attrLocal);
|
||||
attributes.addAttribute(attrURI, attrLocal, NOTHING, CDATA, attrValue, i < specifiedCount);
|
||||
AttributesImpl::Attribute& attr = _attrs.addAttribute();
|
||||
splitName(attrName, attr.namespaceURI, attr.localName);
|
||||
attr.value.assign(attrValue);
|
||||
attr.specified = i < specifiedCount;
|
||||
}
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
splitName(name, uri, local);
|
||||
pContentHandler->startElement(uri, local, NOTHING, attributes);
|
||||
splitName(name, _uri, _local);
|
||||
pContentHandler->startElement(_uri, _local, NOTHING, _attrs);
|
||||
}
|
||||
|
||||
|
||||
@@ -156,15 +164,14 @@ void NoNamespacePrefixesStrategy::endElement(const XMLChar* name, ContentHandler
|
||||
{
|
||||
poco_assert_dbg (name && pContentHandler);
|
||||
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
splitName(name, uri, local);
|
||||
pContentHandler->endElement(uri, local, NOTHING);
|
||||
splitName(name, _uri, _local);
|
||||
pContentHandler->endElement(_uri, _local, NOTHING);
|
||||
}
|
||||
|
||||
|
||||
NamespacePrefixesStrategy::NamespacePrefixesStrategy()
|
||||
{
|
||||
_attrs.reserve(32);
|
||||
}
|
||||
|
||||
|
||||
@@ -177,26 +184,22 @@ void NamespacePrefixesStrategy::startElement(const XMLChar* name, const XMLChar*
|
||||
{
|
||||
poco_assert_dbg (name && atts && pContentHandler);
|
||||
|
||||
AttributesImpl attributes;
|
||||
_attrs.clear();
|
||||
for (int i = 0; *atts; ++i)
|
||||
{
|
||||
const XMLChar* attrName = *atts++;
|
||||
const XMLChar* attrValue = *atts++;
|
||||
XMLString attrURI;
|
||||
XMLString attrLocal;
|
||||
XMLString attrQName;
|
||||
splitName(attrName, attrURI, attrLocal, attrQName);
|
||||
if (!attrQName.empty()) attrQName += ':';
|
||||
attrQName.append(attrLocal);
|
||||
attributes.addAttribute(attrURI, attrLocal, attrQName, CDATA, attrValue, i < specifiedCount);
|
||||
AttributesImpl::Attribute& attr = _attrs.addAttribute();
|
||||
splitName(attrName, attr.namespaceURI, attr.localName, attr.qname);
|
||||
if (!attr.qname.empty()) attr.qname += ':';
|
||||
attr.qname.append(attr.localName);
|
||||
attr.value.assign(attrValue);
|
||||
attr.specified = i < specifiedCount;
|
||||
}
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
XMLString qname;
|
||||
splitName(name, uri, local, qname);
|
||||
if (!qname.empty()) qname += ':';
|
||||
qname.append(local);
|
||||
pContentHandler->startElement(uri, local, qname, attributes);
|
||||
splitName(name, _uri, _local, _qname);
|
||||
if (!_qname.empty()) _qname += ':';
|
||||
_qname.append(_local);
|
||||
pContentHandler->startElement(_uri, _local, _qname, _attrs);
|
||||
}
|
||||
|
||||
|
||||
@@ -204,13 +207,10 @@ void NamespacePrefixesStrategy::endElement(const XMLChar* name, ContentHandler*
|
||||
{
|
||||
poco_assert_dbg (name && pContentHandler);
|
||||
|
||||
XMLString uri;
|
||||
XMLString local;
|
||||
XMLString qname;
|
||||
splitName(name, uri, local, qname);
|
||||
if (!qname.empty()) qname += ':';
|
||||
qname.append(local);
|
||||
pContentHandler->endElement(uri, local, qname);
|
||||
splitName(name, _uri, _local, _qname);
|
||||
if (!_qname.empty()) _qname += ':';
|
||||
_qname.append(_local);
|
||||
pContentHandler->endElement(_uri, _local, _qname);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// ParserEngine.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/ParserEngine.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/ParserEngine.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: XML
|
||||
@@ -249,6 +249,21 @@ void ParserEngine::parse(InputSource* pInputSource)
|
||||
}
|
||||
|
||||
|
||||
void ParserEngine::parse(const char* pBuffer, std::size_t size)
|
||||
{
|
||||
init();
|
||||
resetContext();
|
||||
InputSource src;
|
||||
pushContext(_parser, &src);
|
||||
if (_pContentHandler) _pContentHandler->setDocumentLocator(this);
|
||||
if (_pContentHandler) _pContentHandler->startDocument();
|
||||
if (!XML_Parse(_parser, pBuffer, static_cast<int>(size), 1))
|
||||
handleError(XML_GetErrorCode(_parser));
|
||||
if (_pContentHandler) _pContentHandler->endDocument();
|
||||
popContext();
|
||||
}
|
||||
|
||||
|
||||
void ParserEngine::parseByteInputStream(XMLByteInputStream& istr)
|
||||
{
|
||||
istr.read(_pBuffer, PARSE_BUFFER_SIZE);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// SAXParser.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/SAXParser.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/SAXParser.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
@@ -228,9 +228,14 @@ void SAXParser::parse(const XMLString& systemId)
|
||||
|
||||
void SAXParser::parseString(const std::string& xml)
|
||||
{
|
||||
std::istringstream istr(xml);
|
||||
InputSource src(istr);
|
||||
parse(&src);
|
||||
parseMemoryNP(xml.data(), xml.size());
|
||||
}
|
||||
|
||||
|
||||
void SAXParser::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
setupParse();
|
||||
_engine.parse(xml, size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// XMLFilterImpl.cpp
|
||||
//
|
||||
// $Id: //poco/svn/XML/src/XMLFilterImpl.cpp#2 $
|
||||
// $Id: //poco/svn/XML/src/XMLFilterImpl.cpp#3 $
|
||||
//
|
||||
// Library: XML
|
||||
// Package: SAX
|
||||
@@ -186,6 +186,13 @@ void XMLFilterImpl::parse(const XMLString& systemId)
|
||||
}
|
||||
|
||||
|
||||
void XMLFilterImpl::parseMemoryNP(const char* xml, std::size_t size)
|
||||
{
|
||||
setupParse();
|
||||
_pParent->parseMemoryNP(xml, size);
|
||||
}
|
||||
|
||||
|
||||
InputSource* XMLFilterImpl::resolveEntity(const XMLString* publicId, const XMLString& systemId)
|
||||
{
|
||||
if (_pEntityResolver)
|
||||
|
||||
Reference in New Issue
Block a user