2016-01-19 42 views
0

解析我想解析XML文件,並查找屬性和實體的數據類型的XML模式文件(的.xsd)當我遍歷DOM中集成架構metatdata。XML使用Xerces C++

我發現我可以使用後模式驗證信息集(PSVI)來獲取信息。爲此,我應該能夠通過getFeature方法來獲取節點信息:

info = (xercesc::DOMPSVITypeInfo*) domNode->getFeature(xercesc::XMLUni::fgXercesDOMHasPSVIInfo, xercesc::XMLUni::fgVersion1_1); 

不過我第一次似乎又要啓用此功能。由於解析器對象中沒有setFeature方法,我嘗試了「useImplementation」,但這只是使程序崩潰。

作爲的Xerces文檔中關於PSVI相當稀疏,也許這裏有人知道如何獲得架構信息在解析使用XercesDOMParser的XML文檔。

在此先感謝!

+0

也許這會有所幫助:https://xerces.apache.org/xerces2-j/faq-xs.html –

+0

@ user2642282感謝您的建議。不幸的是,這個FAQ是針對Java的,與C++相比,API有一些差異。也沒有說*如何*設置屬性來獲取PSVIDocumentImpl – Antigo

回答

0

我找到了一個解決方案同時:

//create parser 
static const XMLCh gLS[] = { xercesc::chLatin_L, xercesc::chLatin_S, xercesc::chNull }; 
xercesc::DOMImplementation *impl = xercesc::DOMImplementationRegistry::getDOMImplementation(gLS); 
DOMLSParserImpl* parser = dynamic_cast<DOMLSParserImpl*>(impl->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0)); 

//configure 
parser->setParameter(xercesc::XMLUni::fgXercesDOMHasPSVIInfo, true); //collect schema info 
parser->setParameter(xercesc::XMLUni::fgDOMComments, false); //discard comments 
parser->setExternalNoNamespaceSchemaLocation("schema.xsd"); 
parser->setDoSchema(true); 
parser->setDoNamespaces(true); 
parser->setValidationScheme(xercesc::XercesDOMParser::Val_Always); 

parser->parseURI("file.xml"); 

... 

xercesc::DOMAttr& attr = (xercesc::DOMAttr&) attributeNode; 
cout << " name: " << transcode(attr.getName()) << " type: " << transcode(attr.getSchemaTypeInfo()->getTypeName()) << ", "; 

這是一個有點亂投的解析器下降到實現類,但它是我發現訪問的setParameter功能的唯一途徑。我認爲必須有一個「正確」的方式來初始化解析器,雖然...

此外,它可以設置驗證方案,並設置DoSchema到真正重要的,否則解析器不會附加架構信息的DOM元素。

1

您應該可以通過其DOMConfiguration(請參閱getDomConfig()函數)配置DOMLSParser並避免轉換爲實現類。 DOMConfiguration有幾個setParameter()函數應該支持Xerces的許多配置屬性,包括那些用於XML模式驗證的。

+0

嗨,謝謝你的提示! DOMConfiguration確實暴露了這些參數,但是如果我通過它設置它們,我沒有得到模式信息。不知道爲什麼。 – Antigo

+0

不知道您使用的是哪個版本的Xerces-C,但應該有一個參數對應於您在DOMLSParserImpl上進行的每個直接調用。 –

+0

映射,從Apache的SVN倉庫當前版本DOMLSParserImpl.cpp的拉昇:setExternalNoNamespaceSchemaLocation() - > XMLUni :: fgXercesSchemaExternalNoNameSpaceSchemaLocation, setDoSchema() - > XMLUni :: fgXercesSchema, setDoNamespaces() - > XMLUni :: fgDOMNamespaces, setValidationScheme() - > XMLUni :: fgDOMValidate –