java - 使用 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">
解决方案
即使您将“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 解析它)。
推荐阅读
- php - 如何链接到页面的特定部分 HTML PHP
- c# - 当后端代码中的简单键值变量工作相同时,为什么要使用 redis 作为缓存层?
- google-apps-script - Google Slides Apps 脚本检索页面中的形状
- python-3.x - 在 KNeighborsClassifier 中使用自定义指标时,我不断收到“TypeError:只有整数标量数组可以转换为标量索引”
- java - JavaFX - 在使用选项卡时将 GUI 拆分为单独的类
- jquery - 通过函数调整电子窗口大小
- scheme - 匹配方案中的括号
- android - 当我使用 adb 显示 /sys/kernel/debug/tracing/available_filter_functions 时没有这样的设备
- python - 初始化以迭代抽象pyomo模型中的集合?
- angular-cli - 运行 ng serve -o 时出现错误