以下部分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 %objectPropAttr;>
]>
<!-- xml can be left out, since parser never reaches it -->
<root>
<height min="1" max="5"/>
</root>
修改
我使用java来读取xml:
final File file = new File("file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setValidating(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
dBuilder.parse(file);
错误讯息:
必须在元素“height”的属性列表声明中提供Attributname。
答案 0 :(得分:0)
问题中的DTD仅由internal subset组成。这意味着您不能将参数实体引用用作标记声明的一部分。
它在XML 1.0 Recommendation中指定:http://www.w3.org/TR/REC-xml/#wfc-PEinInternalSubset。
The Annotated XML Specification中的这一说明清楚地解释了它:http://www.xml.com/axml/notes/PEsubsets.html。
在外部子集(单独的文件)中使用时,实体可以正常工作。以下XML文件(root.xml),
<!DOCTYPE root SYSTEM "root.dtd">
<root>
<height min="1"/>
</root>
和以下DTD(root.dtd),
<!ELEMENT root (height+)>
<!ENTITY % objectPropAttr
"min CDATA #REQUIRED
max CDATA #REQUIRED">
<!ELEMENT height EMPTY>
<!ATTLIST height %objectPropAttr;>
使用xmllint处理时生成此输出:
$ 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
这是预期的。如果将max
属性添加到XML文档,则验证成功。