我想使用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行,我在其中添加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?)>
通过阅读xinclude上的其他文章,我确实拥有了这两个模块:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setXIncludeAware(true);
dbf.setNamespaceAware(true);
不确定我是否需要添加xpointer引用,但有人可以提供建议。
以下是一些相关文章: XML Namespaces and DTD validation Trying to use XInclude with Java and resolving the fragment with xml:id Default support for xinclude in Java 6?
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">
答案 0 :(得分:1)
即使您将“ 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">
不确定与应用程序的普通SGML / XML DTD相比,为什么您认为XML Schema是更好的长期解决方案。如果有的话,XML Schema更加复杂和冗长,并且实现更少。但积极警告其某些功能(例如替代组)。同样,在示例中使用XInclude的功能(包括来自其他文件的片段)可以通过使用普通SGML / XML 实体引用轻松实现(请参见{{3} }。