我有一个为大多数文件指定的xml文件。只有一个元素没有规范,可以包含任意 xml 元素。
下面是此 xml 的示例:
<root_element>
<specified_element>
<empty_child_node/>
</specified_element>
<element_with_free_form>
<what><ever><xml><which><is><valid><xml>
</xml></valid></is></which></xml></ever></what>
</element_with_free_form>
</root_element>
我对DTD的理解是,这应该是此类xmls的有效规范:
<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT root_element (specified_element, element_with_free_form)>
<!ELEMENT specified_element (empty_child_node)>
<!ELEMENT empty_child_node EMPTY>
<!ELEMENT element_with_free_form ANY>
以下是嵌入了 DTD 的完整 XML 文档:
<!DOCTYPE root_element [
<!ELEMENT root_element (specified_element, element_with_free_form)>
<!ELEMENT specified_element (empty_child_node)>
<!ELEMENT empty_child_node EMPTY>
<!ELEMENT element_with_free_form ANY>
]>
<root_element>
<specified_element>
<empty_child_node/>
</specified_element>
<element_with_free_form>
<what><ever><xml><which><valid><xml>
</xml></valid></which></xml></ever></what>
</element_with_free_form>
</root_element>
我做错了什么?
即使element_with_free_form
被声明为ANY
,它中的任何元素也必须声明。这意味着您还需要声明what
、ever
、xml
、which
和valid
。
正如 DevNull 已经说过的,ANY
关键字意味着要声明的元素可以包含 #PCDATA
和 DTD 中声明的任何元素的混合。
如果要声明element_with_free_form
可以包含任何平衡良好的 XML,则 DTD 并不是适合您的架构语言。 XSD可以声明这些元素,并支持一些其他变体,如"我不在乎结构是什么,但子项必须都已声明"(这与ANY
的功能相同)和"如果你有一个声明,验证它,如果你没有声明,就让它骑"(这是HTML的"忽略你不理解的东西"原则的一个很好的第一近似)。