0

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”的属性列表声明中提供属性名称。

4

1 回答 1

0

问题中的 DTD 仅包含一个内部子集。这意味着您不能将参数实体引用用作标记声明的一部分。

它在 XML 1.0 建议中指定: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 文档,则验证成功。

于 2013-09-13T15:43:54.477 回答