使用Entity重用属性声明

时间:2013-09-12 17:35:54

标签: 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 %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。

1 个答案:

答案 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文档,则验证成功。