考虑一个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文档 - 那将非常感激!