使用 DTD 时,元素 "xi:include" 的前缀"xi"未绑定



我想使用xincludes来减小xml文件的大小,该文件在java 8应用程序中已增长到21K+LOC,但遇到以下错误:

Nov 04, 2019 4:27:44 PM com.s3.config.XMLValidatorErrorHandler fatalError
SEVERE: Could not parse file (/path/to/CS_Config.xml). line: 80, The prefix "xi" for element "xi:include" is not bound.

我们目前正在使用DTD进行XML验证,尽管我已经读到模式是一个更好的长期解决方案,但我希望在这段时间内完成一些工作,因为我不确定转换为模式文档需要多长时间。

这是我们主配置的第80行,我在其中添加了include:

<xi:include href="ParametersModbus.xml" />
<xi:include href="Parameters.xml" />
<xi:include href="ParametersVirtual.xml" />

到目前为止,我已经将其添加到我们的DTD中:

<!ELEMENT xi:include (#PCDATA)>
<!ATTLIST xi:include 
href CDATA #IMPLIED
>

<!ELEMENT Device (xi:include*,Peripheral*,VirtualPeripheral*,Camera*,MachineSync?,MachineChangeDetection?,Buffers?,Expressions?)>

我确实有这两个MOD,来自阅读xinclude上的其他帖子:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);

不确定我是否需要添加xpinter引用,但有人可以提出建议。

以下是一些相关的帖子:XML命名空间和DTD验证尝试在Java中使用XInclude并使用xml:id解析片段Java 6中对xinclude的默认支持?

11/5更新imhotap下面的回答解决了我的即时问题,当验证关闭时,我们可以处理包含。然而,当我打开验证时,我会得到以下行为:

Nov 05, 2019 3:23:42 PM com.s3.config.XMLValidatorErrorHandler error
SEVERE: Could not parse XML file (/home/jchan/eclipse-workspace/filtec-src/src/gui/test_configs/FIL0000/CS_Config.xml). line: 1, Document is invalid: no grammar found.
Nov 05, 2019 3:23:42 PM com.s3.config.XMLValidatorErrorHandler error
SEVERE: Could not parse XML file (/home/jchan/eclipse-workspace/filtec-src/src/gui/test_configs/FIL0000/CS_Config.xml). line: 1, Document root element "Peripheral", must match DOCTYPE root "null". 

我是否需要做一些事情来不需要在DTD中定义根元素?

11/5 UPDATE 2看起来我的每个包含片段都只需要在所包含文件的根元素之前有DOCTYPE标记。所以在我的情况下是:

<?xml version="1.0"?>
<!DOCTYPE VirtualPeripheral SYSTEM "../../../architecture/peripheral-description/CS_Config.dtd">

即使将"xi:include"声明为元素,也必须将"xi"命名空间绑定到XInclude命名空间URI。尝试将"xmlns:neneneba xi"声明为"xi:include"元素的#FIXED属性,如下所示:

<!ELEMENT xi:include EMPTY>
<!ATTLIST xi:include 
href CDATA #IMPLIED
xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">

不知道为什么您认为XMLSchema与应用程序的普通SGML/XML DTD相比是一个更好的长期解决方案。如果说有什么不同的话,那就是XMLSchema更加复杂和详细,并且实现更少;然而,它的一些特征,如替代群,被积极警告不要使用。同样,在您的示例中使用XInclude的功能(包括来自其他文件的片段(可以使用简单的SGML/XML实体引用更容易地实现(例如,请参阅将一个XML包含在另一个XML中并使用python解析它(。