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

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

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

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

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

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

由于关于 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 类有点麻烦,但这是我发现访问 setParameter 函数的唯一方法。不过,我认为必须有一种“正确”的方式来初始化解析器......

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

关于c++ - 在使用 Xerces C++ 进行 XML 解析期间集成模式元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34878419/

相关文章:

xml - 为什么xml中允许多个 '>'

php - 您在哪些特定情况下使用 JSON 而不是 XML?

java - JAXB 父节点和子节点同名。子节点返回空值

java - 如何解析来自网站的自定义 XML 样式错误代码响应

ruby - 当节点名称是/包含整数时,使用 Nokogiri 解析非 XML 文档

python - 如何在python中修改和枚举XML标签

c++ - 为什么 delete[] 会导致堆损坏错误?

c++ - 使用快速排序对数组进行排序

c++ - 软件或防病毒产品的试用版如何真正发挥作用?

c++ - dllexport'ing 静态模板方法