2016-01-19 46 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 –