X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Fio%2FAbstractXMLObjectUnmarshaller.cpp;h=e33a673007defc2443dafd7b159da29e7da065ee;hb=a0d768778a8f5f539b909baf5b115e70ea765f0f;hp=7230fda5ffe2713df83604131abbf7de9cc4a8cc;hpb=0ed92f33848d3f83e685364fafca1b1417dbd53c;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/io/AbstractXMLObjectUnmarshaller.cpp b/xmltooling/io/AbstractXMLObjectUnmarshaller.cpp index 7230fda..e33a673 100644 --- a/xmltooling/io/AbstractXMLObjectUnmarshaller.cpp +++ b/xmltooling/io/AbstractXMLObjectUnmarshaller.cpp @@ -1,5 +1,5 @@ /* -* Copyright 2001-2006 Internet2 +* Copyright 2001-2010 Internet2 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,8 +32,16 @@ using namespace xmlconstants; using namespace xmltooling; +using namespace xercesc; using namespace std; +AbstractXMLObjectUnmarshaller::AbstractXMLObjectUnmarshaller() +{ +} + +AbstractXMLObjectUnmarshaller::~AbstractXMLObjectUnmarshaller() +{ +} XMLObject* AbstractXMLObjectUnmarshaller::unmarshall(DOMElement* element, bool bindDocument) { @@ -98,18 +106,22 @@ void AbstractXMLObjectUnmarshaller::unmarshallAttributes(const DOMElement* domEl if (XMLString::equals(nsuri,XMLNS_NS)) { if (XMLString::equals(attribute->getLocalName(),XMLNS_PREFIX)) { m_log.debug("found default namespace declaration, adding it to the list of namespaces on the XMLObject"); - addNamespace(Namespace(attribute->getValue(), NULL, true)); - continue; + addNamespace(Namespace(attribute->getValue(), nullptr, true)); + } + else if (XMLString::equals(attribute->getLocalName(),XML_PREFIX) && XMLString::equals(attribute->getNodeValue(),XML_NS)) { + m_log.debug("found standard xml prefix declaration, ignoring as superfluous"); } else { m_log.debug("found namespace declaration, adding it to the list of namespaces on the XMLObject"); addNamespace(Namespace(attribute->getValue(), attribute->getLocalName(), true)); - continue; } + continue; } else if (XMLString::equals(nsuri,XSI_NS)) { static const XMLCh type[]= UNICODE_LITERAL_4(t,y,p,e); static const XMLCh schemaLocation[]= UNICODE_LITERAL_14(s,c,h,e,m,a,L,o,c,a,t,i,o,n); + static const XMLCh noNamespaceSchemaLocation[]= UNICODE_LITERAL_25(n,o,N,a,m,e,s,p,a,c,e,S,c,h,e,m,a,L,o,c,a,t,i,o,n); + static const XMLCh _nil[]= UNICODE_LITERAL_3(n,i,l); if (XMLString::equals(attribute->getLocalName(),type)) { m_log.debug("skipping xsi:type declaration"); continue; @@ -121,10 +133,25 @@ void AbstractXMLObjectUnmarshaller::unmarshallAttributes(const DOMElement* domEl m_schemaLocation=XMLString::replicate(attribute->getValue()); continue; } + else if (XMLString::equals(attribute->getLocalName(),noNamespaceSchemaLocation)) { + m_log.debug("storing off xsi:noNamespaceSchemaLocation attribute"); + if (m_noNamespaceSchemaLocation) + XMLString::release(&m_noNamespaceSchemaLocation); + m_schemaLocation=XMLString::replicate(attribute->getValue()); + m_noNamespaceSchemaLocation=XMLString::replicate(attribute->getValue()); + continue; + } + else if (XMLString::equals(attribute->getLocalName(), _nil)) { + m_log.debug("processing xsi:nil attribute"); + setNil(attribute->getValue()); + continue; + } + // Note that the prefix is visibly used. + addNamespace(Namespace(nsuri, attribute->getPrefix(), false, Namespace::VisiblyUsed)); } else if (nsuri && !XMLString::equals(nsuri,XML_NS)) { - m_log.debug("found namespace-qualified attribute, adding prefix to the list of namespaces on the XMLObject"); - addNamespace(Namespace(nsuri, attribute->getPrefix())); + m_log.debug("found namespace-qualified attribute, adding prefix to the list of visible namespaces on the XMLObject"); + addNamespace(Namespace(nsuri, attribute->getPrefix(), false, Namespace::VisiblyUsed)); } m_log.debug("processing generic attribute"); @@ -172,7 +199,7 @@ void AbstractXMLObjectUnmarshaller::unmarshallContent(const DOMElement* domEleme // Advance the text node position marker. ++position; } - else if (childNode->getNodeType() == DOMNode::TEXT_NODE) { + else if (childNode->getNodeType() == DOMNode::TEXT_NODE || childNode->getNodeType() == DOMNode::CDATA_SECTION_NODE) { m_log.debug("processing text content at position (%d)", position); setTextContent(childNode->getNodeValue(), position); }