我有以下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/