使用 DTD 指定具有自由格式元素的 xml 文件



我有一个为大多数文件指定的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,它中的任何元素也必须声明。这意味着您还需要声明whateverxmlwhichvalid

正如 DevNull 已经说过的,ANY 关键字意味着要声明的元素可以包含 #PCDATA 和 DTD 中声明的任何元素的混合。

如果要声明element_with_free_form可以包含任何平衡良好的 XML,则 DTD 并不是适合您的架构语言。 XSD可以声明这些元素,并支持一些其他变体,如"我不在乎结构是什么,但子项必须都已声明"(这与ANY的功能相同)和"如果你有一个声明,验证它,如果你没有声明,就让它骑"(这是HTML的"忽略你不理解的东西"原则的一个很好的第一近似)。

相关内容

  • 没有找到相关文章

最新更新