如何配置Xerces-C ++以在XML模式验证之前处理XIncludes

时间:2016-10-19 16:23:13

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

考虑一个XML文件 config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration
  xsi:noNamespaceSchemaLocation = "rules.xsd"
  xmlns:xsi                     = "http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xi                      = "http://www.w3.org/2001/XInclude"
>
  <xi:include href="bunnies.xml" />
  <xi:include href="doggies.xml" />
</Configuration>

其中 rules.xsd 是描述结构和结构的XML Schema文档。处理完XIncludes后 config.xml 的约束。

使用 xmllint ,可以从命令行执行XML Schema验证之前执行XIncludes:

xmllint --xinclude --schema rules.xsd config.xml

xmllint工具将选择对子项 bunnies.xml doggies.xml 进行无效更改。

我希望使用Xerces-C在XML Schema之前应用XIncludes,以便在运行时使用XML之前确定软件的配置是否有效。我目前的道路让我看着Xerces's DOMLSParser

我设法让解析器执行XML Schema验证 - 或XIncludes - 但是当我尝试配置这两种行为时,似乎在XIncludes之前运行了XML Schema验证检查;这会错误地使文件无效。

XInclude.cpp sample in Xerces-C解析器初始化&amp;配置如下:

static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull };
DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(gLS);
DOMLSParser       *parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
DOMConfiguration  *config = parser->getDomConfig();

config->setParameter(XMLUni::fgDOMNamespaces, true);
config->setParameter(XMLUni::fgXercesSchema, true);
config->setParameter(XMLUni::fgXercesHandleMultipleImports, true);
config->setParameter(XMLUni::fgXercesSchemaFullChecking, true);
config->setParameter(XMLUni::fgXercesDoXInclude, true);

config->setParameter(XMLUni::fgDOMValidate, false);

如果启用了fgDOMValidate,则验证将失败,因为它在XIncludes之前运行 如果禁用fgDOMValidate - 验证根本不运行;但XIncludes do!

我的问题 - 有没有办法配置Xerces-C解析器来执行上述操作?或者我应该考虑更直接地执行它,比如创建一个只执行XIncludes的解析器 - 将输出流式传输到内存中 - 然后创建一个解析器来处理XML Schema并将包含的XML传递给另一个/或重新配置的解析器?

此外,如果有任何人在学习Xerces-C之外的经验或指针超出了他们的API文档 - 那将非常感激!

0 个答案:

没有答案