【问题标题】:Integrate schema metatdata during XML Parsing with Xerces C++在 XML 解析期间使用 Xerces C++ 集成模式元数据
【发布时间】:2016-01-19 13:44:23
【问题描述】:

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

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

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

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

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

提前致谢!

【问题讨论】:

  • @user2642282 感谢您的建议。不幸的是,此常见问题解答适用于 Java,与 C++ 相比,API 存在一些差异。它也没有说 如何 设置属性以获取 PSVIDocumentImpl

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


【解决方案1】:

我同时找到了解决方案:

//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 元素。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您好,感谢您的提示! DOMConfiguration 确实公开了这些参数,但如果我通过它设置它们,我不会得到架构信息。不知道为什么。
    • 不确定您使用的是哪个版本的 Xerces-C,但应该有一个参数对应于您在 DOMLSParserImpl 上进行的每个直接调用。
    • 映射,从 Apache 的 SVN 存储库中的当前版本的 DOMLSParserImpl.cpp 中提取: setExternalNoNamespaceSchemaLocation() --> XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation, setDoSchema() --> XMLUni::fgXercesSchema, setDoNamespaces() - -> XMLUni::fgDOMNamespaces, setValidationScheme() --> XMLUni::fgDOMValidate
    猜你喜欢
    • 2013-03-04
    • 2013-07-22
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多