【问题标题】:Reuse attribute declaration using Entity使用实体重用属性声明
【发布时间】:2013-09-15 01:55:41
【问题描述】:

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

【问题讨论】:

  • 我正在使用 java 读取文件。所有在线验证器也会在这个位置抛出类似的信息。
  • 如何重现问题? “我正在使用 java”信息太少。
  • 用代码更新了问题。

标签: java xml dtd


【解决方案1】:

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

它在 XML 1.0 建议中指定:http://www.w3.org/TR/REC-xml/#wfc-PEinInternalSubset

注释 XML 规范中的注释清楚地解释了这一点: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 文档中,则验证成功。

【讨论】:

  • 感谢您抽出宝贵的时间,但我看不出您的“用例”与 dtd 验证错误有关。甚至没有提供 xml 用例,也没有必要,因为 dtd 本身无效。由于您的示例中需要max,因此您的错误消息是可以预测的。我创建了一个完整的 xml 文件,包括 dtd(和不必要的 xml 实例)并编辑了我的问题。
  • 从问题的第一个修订版中不清楚只有internal subset
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2013-09-17
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多