From 208033c53430f82706ddf5f411747230d8da70da Mon Sep 17 00:00:00 2001 From: Scott Cantor Date: Tue, 16 Dec 2008 04:31:25 +0000 Subject: [PATCH] Xerces 3 revisions. --- xmltooling/util/ParserPool.cpp | 202 +++++++++++++++++++++++++-------- xmltooling/util/ParserPool.h | 11 +- xmltoolingtest/ComplexXMLObjectTest.h | 2 +- xmltoolingtest/MarshallingTest.h | 14 +-- xmltoolingtest/SignatureTest.h | 10 +- xmltoolingtest/UnmarshallingTest.h | 12 +- xmltoolingtest/XMLObjectBaseTestCase.h | 10 +- 7 files changed, 184 insertions(+), 77 deletions(-) diff --git a/xmltooling/util/ParserPool.cpp b/xmltooling/util/ParserPool.cpp index abe019c..7001a86 100644 --- a/xmltooling/util/ParserPool.cpp +++ b/xmltooling/util/ParserPool.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Internet2 + * Copyright 2001-2008 Internet2 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ /** * ParserPool.cpp * - * XML parsing + * A thread-safe pool of parsers that share characteristics. */ #include "internal.h" @@ -43,6 +43,56 @@ using namespace xmltooling; using namespace xercesc; using namespace std; + +namespace { + class MyErrorHandler : public DOMErrorHandler { + public: + unsigned int errors; + + MyErrorHandler() : errors(0) {} + + bool handleError(const DOMError& e) + { +#ifdef _DEBUG + xmltooling::NDC ndc("handleError"); +#endif + Category& log=Category::getInstance(XMLTOOLING_LOGCAT".ParserPool"); + + DOMLocator* locator=e.getLocation(); + auto_ptr_char temp(e.getMessage()); + + switch (e.getSeverity()) { + case DOMError::DOM_SEVERITY_WARNING: + log.warnStream() << "warning on line " << locator->getLineNumber() + << ", column " << locator->getColumnNumber() + << ", message: " << temp.get() << logging::eol; + return true; + + case DOMError::DOM_SEVERITY_ERROR: + ++errors; + log.errorStream() << "error on line " << locator->getLineNumber() + << ", column " << locator->getColumnNumber() + << ", message: " << temp.get() << logging::eol; + return true; + + case DOMError::DOM_SEVERITY_FATAL_ERROR: + ++errors; + log.errorStream() << "fatal error on line " << locator->getLineNumber() + << ", column " << locator->getColumnNumber() + << ", message: " << temp.get() << logging::eol; + return true; + } + + ++errors; + log.errorStream() << "undefined error type on line " << locator->getLineNumber() + << ", column " << locator->getColumnNumber() + << ", message: " << temp.get() << logging::eol; + return false; + } + }; +} + + ParserPool::ParserPool(bool namespaceAware, bool schemaAware) : m_namespaceAware(namespaceAware), m_schemaAware(schemaAware), m_lock(Mutex::create()), m_security(new SecurityManager()) {} @@ -61,39 +111,76 @@ DOMDocument* ParserPool::newDocument() return DOMImplementationRegistry::getDOMImplementation(NULL)->createDocument(); } -DOMDocument* ParserPool::parse( #ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS - DOMLSInput& domsrc - ) + +DOMDocument* ParserPool::parse(DOMLSInput& domsrc) { DOMLSParser* parser=checkoutBuilder(); XercesJanitor janitor(parser); try { + MyErrorHandler deh; + parser->getDomConfig()->setParameter(XMLUni::fgDOMErrorHandler, dynamic_cast(&deh)); DOMDocument* doc=parser->parse(&domsrc); - parser->getDomConfig()->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument,true); + if (deh.errors) { + doc->release(); + throw XMLParserException("XML error(s) during parsing, check log for specifics"); + } + parser->getDomConfig()->setParameter(XMLUni::fgDOMErrorHandler, (void*)NULL); + parser->getDomConfig()->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument, true); + checkinBuilder(janitor.release()); + return doc; + } + catch (XMLException& ex) { + parser->getDomConfig()->setParameter(XMLUni::fgDOMErrorHandler, (void*)NULL); + parser->getDomConfig()->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument, true); + checkinBuilder(janitor.release()); + auto_ptr_char temp(ex.getMessage()); + throw XMLParserException(string("Xerces error during parsing: ") + (temp.get() ? temp.get() : "no message")); + } + catch (XMLToolingException&) { + parser->getDomConfig()->setParameter(XMLUni::fgDOMErrorHandler, (void*)NULL); + parser->getDomConfig()->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument, true); + checkinBuilder(janitor.release()); + throw; + } +} + #else - DOMInputSource& domsrc - ) + +DOMDocument* ParserPool::parse(DOMInputSource& domsrc) { DOMBuilder* parser=checkoutBuilder(); XercesJanitor janitor(parser); try { + MyErrorHandler deh; + parser->setErrorHandler(&deh); DOMDocument* doc=parser->parse(domsrc); - parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument,true); -#endif + if (deh.errors) { + doc->release(); + throw XMLParserException("XML error(s) during parsing, check log for specifics"); + } + parser->setErrorHandler(NULL); + parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument, true); checkinBuilder(janitor.release()); return doc; } - catch (XMLException&) { + catch (XMLException& ex) { + parser->setErrorHandler(NULL); + parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument, true); checkinBuilder(janitor.release()); - throw; + auto_ptr_char temp(ex.getMessage()); + throw XMLParserException(string("Xerces error during parsing: ") + (temp.get() ? temp.get() : "no message")); } catch (XMLToolingException&) { + parser->setErrorHandler(NULL); + parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument, true); checkinBuilder(janitor.release()); throw; } } +#endif + DOMDocument* ParserPool::parse(istream& is) { StreamInputSource src(is); @@ -294,38 +381,63 @@ DOMInputSource* ParserPool::resolveEntity( return new Wrapper4InputSource(new MemBufInputSource(nullbuf,0,systemId)); } -bool ParserPool::handleError(const DOMError& e) +#ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS + +DOMLSParser* ParserPool::createBuilder() { -#ifdef _DEBUG - xmltooling::NDC ndc("handleError"); + static const XMLCh impltype[] = { chLatin_L, chLatin_S, chNull }; + DOMImplementation* impl=DOMImplementationRegistry::getDOMImplementation(impltype); + DOMLSParser* parser=static_cast(impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS,NULL); + parser->getDomConfig()->setParameter(XMLUni::fgDOMNamespaces, m_namespaceAware); + if (m_schemaAware) { + parser->getDomConfig()->setParameter(XMLUni::fgDOMNamespaces, true); + parser->getDomConfig()->setParameter(XMLUni::fgXercesSchema, true); + parser->getDomConfig()->setParameter(XMLUni::fgDOMValidate, true); + parser->getDomConfig()->setParameter(XMLUni::fgXercesCacheGrammarFromParse, true); + + // We build a "fake" schema location hint that binds each namespace to itself. + // This ensures the entity resolver will be given the namespace as a systemId it can check. +#ifdef HAVE_GOOD_STL + parser->getDomConfig()->setParameter(XMLUni::fgXercesSchemaExternalSchemaLocation, const_cast(m_schemaLocations.c_str())); +#else + auto_ptr_XMLCh temp(m_schemaLocations.c_str()); + parser->getDomConfig()->setParameter(XMLUni::fgXercesSchemaExternalSchemaLocation, const_cast(temp.get())); #endif - Category& log=Category::getInstance(XMLTOOLING_LOGCAT".ParserPool"); - DOMLocator* locator=e.getLocation(); - auto_ptr_char temp(e.getMessage()); - - switch (e.getSeverity()) { - case DOMError::DOM_SEVERITY_WARNING: - log.warnStream() << "warning on line " << locator->getLineNumber() - << ", column " << locator->getColumnNumber() - << ", message: " << temp.get() << logging::eol; - return true; - - case DOMError::DOM_SEVERITY_ERROR: - log.errorStream() << "error on line " << locator->getLineNumber() - << ", column " << locator->getColumnNumber() - << ", message: " << temp.get() << logging::eol; - throw XMLParserException(string("error during XML parsing: ") + (temp.get() ? temp.get() : "no message")); + } + parser->getDomConfig()->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument, true); + parser->getDomConfig()->setParameter(XMLUni::fgXercesDisableDefaultEntityResolution, true); + parser->getDomConfig()->setParameter(XMLUni::fgDOMResourceResolver, dynamic_cast(this)); + parser->getDomConfig()->setParameter(XMLUni::fgXercesSecurityManager, m_security); + return parser; +} - case DOMError::DOM_SEVERITY_FATAL_ERROR: - log.errorStream() << "fatal error on line " << locator->getLineNumber() - << ", column " << locator->getColumnNumber() - << ", message: " << temp.get() << logging::eol; - throw XMLParserException(string("fatal error during XML parsing: ") + (temp.get() ? temp.get() : "no message")); +DOMLSParser* ParserPool::checkoutBuilder() +{ + Lock lock(m_lock); + if (m_pool.empty()) { + DOMLSParser* builder=createBuilder(); + return builder; + } + DOMLSParser* p=m_pool.top(); + m_pool.pop(); + if (m_schemaAware) { +#ifdef HAVE_GOOD_STL + p->getDomConfig()->setParameter(XMLUni::fgXercesSchemaExternalSchemaLocation, const_cast(m_schemaLocations.c_str())); +#else + auto_ptr_XMLCh temp2(m_schemaLocations.c_str()); + p->getDomConfig()->setParameter(XMLUni::fgXercesSchemaExternalSchemaLocation, const_cast(temp2.get())); +#endif } - throw XMLParserException(string("unclassified error during XML parsing: ") + (temp.get() ? temp.get() : "no message")); + return p; } -#ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS +void ParserPool::checkinBuilder(DOMLSParser* builder) +{ + if (builder) { + Lock lock(m_lock); + m_pool.push(builder); + } +} #else @@ -334,13 +446,12 @@ DOMBuilder* ParserPool::createBuilder() static const XMLCh impltype[] = { chLatin_L, chLatin_S, chNull }; DOMImplementation* impl=DOMImplementationRegistry::getDOMImplementation(impltype); DOMBuilder* parser=static_cast(impl)->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS,0); - if (m_namespaceAware) - parser->setFeature(XMLUni::fgDOMNamespaces,true); + parser->setFeature(XMLUni::fgDOMNamespaces, m_namespaceAware); if (m_schemaAware) { - parser->setFeature(XMLUni::fgXercesSchema,true); - parser->setFeature(XMLUni::fgDOMValidation,true); - parser->setFeature(XMLUni::fgXercesCacheGrammarFromParse,true); - parser->setFeature(XMLUni::fgXercesValidationErrorAsFatal,true); + parser->setFeature(XMLUni::fgDOMNamespaces, true); + parser->setFeature(XMLUni::fgXercesSchema, true); + parser->setFeature(XMLUni::fgDOMValidation, true); + parser->setFeature(XMLUni::fgXercesCacheGrammarFromParse, true); // We build a "fake" schema location hint that binds each namespace to itself. // This ensures the entity resolver will be given the namespace as a systemId it can check. @@ -352,9 +463,8 @@ DOMBuilder* ParserPool::createBuilder() #endif } parser->setProperty(XMLUni::fgXercesSecurityManager, m_security); - parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument,true); + parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument, true); parser->setEntityResolver(this); - parser->setErrorHandler(this); return parser; } diff --git a/xmltooling/util/ParserPool.h b/xmltooling/util/ParserPool.h index 248645d..ec9b5b5 100644 --- a/xmltooling/util/ParserPool.h +++ b/xmltooling/util/ParserPool.h @@ -34,8 +34,8 @@ #include #include -#ifndef XMLTOOLING_NO_XMLSEC -# include +#ifndef XMLTOOLING_NO_XMLSEC +# include #endif #if defined (_MSC_VER) @@ -48,7 +48,7 @@ namespace xmltooling { /** * A thread-safe pool of DOMBuilders that share characteristics. */ - class XMLTOOL_API ParserPool : xercesc::DOMErrorHandler, + class XMLTOOL_API ParserPool : #ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS public xercesc::DOMLSResourceResolver #else @@ -138,11 +138,6 @@ namespace xmltooling { ); #endif - /** - * Handles parsing errors - */ - bool handleError(const xercesc::DOMError& e); - private: #ifdef XMLTOOLING_XERCESC_COMPLIANT_DOMLS xercesc::DOMLSParser* createBuilder(); diff --git a/xmltoolingtest/ComplexXMLObjectTest.h b/xmltoolingtest/ComplexXMLObjectTest.h index 33530e2..e2b6e78 100644 --- a/xmltoolingtest/ComplexXMLObjectTest.h +++ b/xmltoolingtest/ComplexXMLObjectTest.h @@ -56,7 +56,7 @@ public: static const XMLCh html[] = {chLatin_h, chLatin_t, chLatin_m, chLatin_l, chNull}; static const XMLCh div[] = {chLatin_d, chLatin_i, chLatin_v, chNull}; auto_ptr_XMLCh htmlns("http://www.w3.org/1999/xhtml"); - QName q(htmlns.get(),div,html); + xmltooling::QName q(htmlns.get(),div,html); TSM_ASSERT_EQUALS("Element QName unexpected", wc2->getUnknownXMLObjects()[2]->getElementQName(),q); DOMElement* rebuilt = wcObject->marshall(XMLToolingConfig::getConfig().getParser().newDocument()); diff --git a/xmltoolingtest/MarshallingTest.h b/xmltoolingtest/MarshallingTest.h index a686026..823c5fd 100644 --- a/xmltoolingtest/MarshallingTest.h +++ b/xmltoolingtest/MarshallingTest.h @@ -21,21 +21,20 @@ class MarshallingTest : public CxxTest::TestSuite { public: void setUp() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); XMLObjectBuilder::registerBuilder(qname, new SimpleXMLObjectBuilder()); XMLObjectBuilder::registerBuilder(qtype, new SimpleXMLObjectBuilder()); } void tearDown() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); XMLObjectBuilder::deregisterBuilder(qname); XMLObjectBuilder::deregisterBuilder(qtype); } void testMarshallingWithAttributes() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); auto_ptr sxObject(SimpleXMLObjectBuilder::buildSimpleXMLObject()); TS_ASSERT(sxObject.get()!=NULL); auto_ptr_XMLCh expected("Firefly"); @@ -53,7 +52,6 @@ public: } void testMarshallingWithElementContent() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); auto_ptr sxObject(SimpleXMLObjectBuilder::buildSimpleXMLObject()); TS_ASSERT(sxObject.get()!=NULL); auto_ptr_XMLCh expected("Sample Content"); @@ -71,7 +69,7 @@ public: } void testMarshallingWithChildElements() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); const SimpleXMLObjectBuilder* b=dynamic_cast(XMLObjectBuilder::getBuilder(qname)); TS_ASSERT(b!=NULL); @@ -91,7 +89,7 @@ public: kids.erase(kids.begin()+1); TS_ASSERT(XMLString::equals(kids.back()->getValue(), bar.get())); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME,SimpleXMLObject::NAMESPACE_PREFIX); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME,SimpleXMLObject::NAMESPACE_PREFIX); kids.push_back( dynamic_cast( b->buildObject(SimpleXMLObject::NAMESPACE,SimpleXMLObject::DERIVED_NAME,SimpleXMLObject::NAMESPACE_PREFIX,&qtype) diff --git a/xmltoolingtest/SignatureTest.h b/xmltoolingtest/SignatureTest.h index fc682e1..138ce55 100644 --- a/xmltoolingtest/SignatureTest.h +++ b/xmltoolingtest/SignatureTest.h @@ -74,8 +74,8 @@ class SignatureTest : public CxxTest::TestSuite { public: void setUp() { m_resolver=NULL; - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); XMLObjectBuilder::registerBuilder(qname, new SimpleXMLObjectBuilder()); XMLObjectBuilder::registerBuilder(qtype, new SimpleXMLObjectBuilder()); @@ -89,15 +89,15 @@ public: } void tearDown() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); XMLObjectBuilder::deregisterBuilder(qname); XMLObjectBuilder::deregisterBuilder(qtype); delete m_resolver; } void testSignature() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); const SimpleXMLObjectBuilder* b=dynamic_cast(XMLObjectBuilder::getBuilder(qname)); TS_ASSERT(b!=NULL); diff --git a/xmltoolingtest/UnmarshallingTest.h b/xmltoolingtest/UnmarshallingTest.h index a5e655d..43c2735 100644 --- a/xmltoolingtest/UnmarshallingTest.h +++ b/xmltoolingtest/UnmarshallingTest.h @@ -55,15 +55,15 @@ const XMLCh SimpleXMLObject::ID_ATTRIB_NAME[] = { class UnmarshallingTest : public CxxTest::TestSuite { public: void setUp() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); XMLObjectBuilder::registerBuilder(qname, new SimpleXMLObjectBuilder()); XMLObjectBuilder::registerBuilder(qtype, new SimpleXMLObjectBuilder()); } void tearDown() { - QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); XMLObjectBuilder::deregisterBuilder(qname); XMLObjectBuilder::deregisterBuilder(qtype); } @@ -120,7 +120,7 @@ public: VectorOf(SimpleXMLObject) kids=sxObject->getSimpleXMLObjects(); TSM_ASSERT_EQUALS("Number of child elements was not expected value", 3, kids.size()); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); TSM_ASSERT_EQUALS("Child's schema type was not expected value", qtype, *(kids.back()->getSchemaType())); } @@ -143,7 +143,7 @@ public: VectorOf(SimpleXMLObject) kids=clonedObject->getSimpleXMLObjects(); TSM_ASSERT_EQUALS("Number of child elements was not expected value", 3, kids.size()); - QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); + xmltooling::QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME); TSM_ASSERT_EQUALS("Child's schema type was not expected value", qtype, *(kids.back()->getSchemaType())); } diff --git a/xmltoolingtest/XMLObjectBaseTestCase.h b/xmltoolingtest/XMLObjectBaseTestCase.h index d0b3b89..99aa08f 100644 --- a/xmltoolingtest/XMLObjectBaseTestCase.h +++ b/xmltoolingtest/XMLObjectBaseTestCase.h @@ -74,7 +74,7 @@ public: static const XMLCh ID_ATTRIB_NAME[]; SimpleXMLObject( - const XMLCh* nsURI=NULL, const XMLCh* localName=NULL, const XMLCh* prefix=NULL, const QName* schemaType=NULL + const XMLCh* nsURI=NULL, const XMLCh* localName=NULL, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_id(NULL) { #ifndef XMLTOOLING_NO_XMLSEC m_children.push_back(NULL); @@ -126,7 +126,11 @@ protected: void marshallAttributes(xercesc::DOMElement* domElement) const { if(getId()) { domElement->setAttributeNS(NULL, SimpleXMLObject::ID_ATTRIB_NAME, getId()); +#ifdef XMLTOOLING_XERCESC_BOOLSETIDATTRIBUTE + domElement->setIdAttributeNS(NULL, SimpleXMLObject::ID_ATTRIB_NAME, true); +#else domElement->setIdAttributeNS(NULL, SimpleXMLObject::ID_ATTRIB_NAME); +#endif } } @@ -171,14 +175,14 @@ public: } XMLObject* buildObject( - const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const QName* schemaType=NULL + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL ) const { return new SimpleXMLObject(nsURI, localName, prefix, schemaType); } static SimpleXMLObject* buildSimpleXMLObject() { const SimpleXMLObjectBuilder* b = dynamic_cast( - XMLObjectBuilder::getBuilder(QName(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME)) + XMLObjectBuilder::getBuilder(xmltooling::QName(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME)) ); if (b) return dynamic_cast(b->buildObject()); -- 2.1.4