xml - 内部 DTD 中的参数实体

标签 xml dtd

我有以下simple.dtd:

<!ENTITY % placeholder "my, element, list">
<!ELEMENT root (%placeholder;)>
<!ELEMENT my (#PCDATA)>
<!ELEMENT element (#PCDATA)>
<!ELEMENT list (#PCDATA)>

simple.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root SYSTEM "simple.dtd">

<root>
    <my />
    <element />
    <list />
</root>

这有效且有效。

但是完全相同的 DTD 内联:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
        <!ENTITY % placeholder "my, element, list">
        <!ELEMENT root (%placeholder;)>
        <!ELEMENT my (#PCDATA)>
        <!ELEMENT element (#PCDATA)>
        <!ELEMENT list (#PCDATA)>
]>

<root>
    <my />
    <element />
    <list />
</root>

因错误而失败:

$ xmllint --valid simple.xml
simple.xml:4: parser error : ContentDecl : Name or '(' expected
        <!ELEMENT root (%placeholder;)>
                        ^
simple.xml:4: parser error : expected '>'
        <!ELEMENT root (%placeholder;)>
                        ^
Entity: line 1: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration

 %placeholder; 
              ^
Entity: line 1: 
my, element, list
^
Entity: line 1: parser error : DOCTYPE improperly terminated
 %placeholder; 
              ^
Entity: line 1: 
my, element, list
^
Entity: line 1: parser error : Start tag expected, '<' not found
 %placeholder; 
              ^
Entity: line 1: 
my, element, list
^

为什么会这样?

最佳答案

在 DTD 的内部子集中,不允许在标记声明中引用参数实体。您必须使用外部 DTD,即单独的文件。这在 XML 规范中记录为格式良好约束 here .

关于xml - 内部 DTD 中的参数实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39549360/

相关文章:

xml - 为什么简单的 XPATH 不起作用

xml - 如何使用 Xpath 1.0 从 XML 文档中查找最大属性

java - java解析xml时如何缓存dtd文件

javascript - 根据 Javascript 中的 DTD 验证 XML?

java - jdom之类的命令文件的DTD

java - 在未排序的 xml 文件中查找特定值

php - 将 xPath 用于 sitemap.xml

android - 如何让一个数字替换 android :hint, 的一个字母,而提示仍然存在,直到我全部替换它? (安卓工作室)

java - 使用 Stax 进行 DTD 解析

java - Java 中是否有与 Ruby 的 Nokogiri::XML::EntityDecl 等效的东西?