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

Integrate schema metatdata during XML Parsing with Xerces C++

我想解析一个 XML 文件并在我遍历 DOM.

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

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

不过我好像首先要启用这个功能。由于我尝试 "useImplementation" 的解析器对象中没有 setFeature 方法,但这只会让我的程序崩溃。

由于关于 PSVI 的 Xerces 文档非常稀少,也许这里有人知道如何在使用 XercesDOMParser 解析 XML 文档时获取架构信息。

提前致谢!

我同时找到了解决方案:

//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 class 有点麻烦,但这是我发现访问 setParameter 函数的唯一方法。我认为必须有一种 "correct" 方法来初始化解析器,但是...

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

您应该能够配置 DOMLSParser through its DOMConfiguration,(请参阅 getDomConfig() 函数)并避免转换为实现 class。 DOMConfiguration 有几个 setParameter() 函数,它们应该支持 Xerces 的许多配置属性,包括用于 XML 模式验证的那些。