首页 > 解决方案 > 使用 DTD 时,元素“xi:include”的前缀“xi”未绑定

问题描述

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

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 行,我在其中添加了包含:

<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?)>

通过阅读其他人在 xinclude 上的帖子,我确实有这两个模块:

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

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

这里有一些相关的帖子: XML Namespaces and DTD validation Trying to use XInclude with Java and resolve the fragment with 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 更新 2 看起来我的每个包含片段只需要在包含的文件的根元素之前有 DOCTYPE 标记。所以在我的情况下是:

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

标签: javaxmldtdxinclude

解决方案


即使您将“xi:include”声明为一个元素,您仍然必须将“xi”命名空间绑定到 XInclude 命名空间 URI。尝试在“xi:include”元素上将“xmlns:xi”声明为 #FIXED 属性,如下所示:

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

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


推荐阅读