Java 使用实体重用属性声明
dtd的以下部分无效/正在工作:Java 使用实体重用属性声明,java,xml,dtd,Java,Xml,Dtd,dtd的以下部分无效/正在工作: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ELEMENT root (height)> <!ENTITY % objectPropAttr "min CDATA #REQUIRED max CDATA #REQUIRED"> <!ELEMENT height EMPTY> <!ATTLIST height %objectPr
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ELEMENT root (height)>
<!ENTITY % objectPropAttr
"min CDATA #REQUIRED
max CDATA #REQUIRED">
<!ELEMENT height EMPTY>
<!ATTLIST height %objectPropAttr;>
]>
<!-- xml can be left out, since parser never reaches it -->
<root>
<height min="1" max="5"/>
</root>
错误消息:
必须在元素“高度”的属性列表声明中提供AttributeName。问题中的DTD仅包含一个。这意味着您不能将参数实体引用用作标记声明的一部分 它在XML 1.0建议中指定: 注释XML规范中的这一注释清楚地解释了这一点:
实体在外部子集(单独的文件)中使用时工作正常。以下XML文件(root.XML)
以及下面的DTD(root.DTD)
使用以下工具处理时生成此输出:
$xmllint--postvalid root.xml
root.xml:3:元素高度:有效性错误:元素高度不包含属性max
文档root.xml未验证
这是意料之中的。如果将
max
属性添加到XML文档中,验证将成功。我正在使用java读取文件。所有在线验证器也会在这个位置抛出类似的信息。如何重现这个问题?“我正在使用java”的信息太少。它通过用代码更新问题来验证。感谢您花时间,但我看不出您的“用例”与dtd验证错误有何关联。甚至没有提供xml用例,也没有必要,因为dtd本身无效。由于示例中需要max
,因此错误消息是可预测的。我创建了一个完整的xml文件,包括dtd(以及不必要的xml实例)并编辑了我的问题。
final File file = new File("file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setValidating(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
dBuilder.parse(file);
<!DOCTYPE root SYSTEM "root.dtd">
<root>
<height min="1"/>
</root>
<!ELEMENT root (height+)>
<!ENTITY % objectPropAttr
"min CDATA #REQUIRED
max CDATA #REQUIRED">
<!ELEMENT height EMPTY>
<!ATTLIST height %objectPropAttr;>
$ xmllint --postvalid root.xml
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "root.dtd">
<root>
<height min="1"/>
</root>
root.xml:3: element height: validity error : Element height does not carry attribute max
Document root.xml does not validate