使用Xerces C ++在XML解析期间集成模式元数据

时间:2016-01-19 13:44:23

标签: c++ xml xml-parsing xerces xerces-c

当我遍历DOM时,我想解析XML文件并在XML模式文件(.xsd)中查找属性和实体的数据类型。

我发现我可以使用post schema验证信息集(PSVI)来获取该信息。为此,我应该能够通过getFeature方法获取节点信息:

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

但我首先似乎必须启用此功能。由于解析器对象中没有setFeature方法,我尝试了“useImplementation”,但这只会导致程序崩溃。

由于Xerces的文档在PSVI方面非常稀少,这里的某些人可能知道在使用XercesDOMParser解析XML文档时如何获取模式信息。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您应该能够通过DOMLSParser配置DOMConfiguration,(请参阅getDomConfig()函数)并避免强制转换为实现类。 DOMConfiguration有几个setParameter()函数,它们应该支持Xerces的许多配置属性,包括用于XML Schema验证的属性。

答案 1 :(得分: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()) << ", ";

将解析器转换为Impl类有点麻烦,但这是我发现访问setParameter函数的唯一方法。我认为必须有一种“正确”的方式来初始化解析器,但是......

设置验证方案并将DoSchema设置为true也很重要,否则解析器不会将架构信息附加到DOM元素。