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

时间:2012-04-11 10:29:40

标签: xml dtd

我有一个大部分指定的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>

我做错了什么?

2 个答案:

答案 0 :(得分:0)

即使element_with_free_form声明为ANY,也必须声明其中的任何元素。这意味着您还需要whateverxmlwhichvalid的声明。

答案 1 :(得分:0)

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

如果您想声明element_with_free_form可以包含任何均衡的XML,那么DTD对您来说就不是正确的模式语言。 XSD可以声明这些元素,以及支持一些其他变体,例如“我不关心结构是什么,但是孩子们必须都已经声明了”(这与ANY具有相同的功能)和“If你有一个声明它,验证它,如果你没有它的声明,让它骑“(这是一个很好的第一个近似的”忽略你不理解的“HTML原则)。