【问题标题】:XML DTD elements with the same children具有相同子代的 XML DTD 元素
【发布时间】:2013-01-21 23:08:39
【问题描述】:

这进入了我的大脑,所以我有一个 XML 文档,其中有一个名为 family 的节点

<family>
  <parents>
    <name>Bob</name>
    <init>R</init>
    <surname>Johnson</surename>
  </parents>
  <kids>
    <name>Lucy</name>
    <surname>Johnson</surname>
  </kids>
</family>

初始是可选的,所以我为此创建了 DTD,它最终看起来像

<!ELEMENT parent (name, initial?, surname)>
<!ELEMENT kid (name, initial?, surname)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT initial (#PCDATA)>
<!ELEMENT surname (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT initial (#PCDATA)>
<!ELEMENT surname (#PCDATA)>

但我不断收到此错误有效性错误:重新定义元素名称 ^ /tmp/tmp.dtd:26:有效性错误:重新定义元素初始 ^ /tmp/tmp.dtd:27:有效性错误:重新定义元素姓氏^

即使我将 DTD 更改为如下所示。

<!ELEMENT parent (name, initial?, surname)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT initial (#PCDATA)>
<!ELEMENT surname (#PCDATA)>
<!ELEMENT kid (name, initial?, surname)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT initial (#PCDATA)>
<!ELEMENT surname (#PCDATA)>

同样的错误..这实际上是我使用 xml 的第二天,从我读过的教程中我似乎看不出我做错了什么..

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

    nameinitialsurname 不需要声明两次,只需尝试

    <!ELEMENT parent (name, initial?, surname)>
    <!ELEMENT kid (name, initial?, surname)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT initial (#PCDATA)>
    <!ELEMENT surname (#PCDATA)>
    

    parentkid 对其三个(或两个)子元素共享相同的定义。给定一个额外的定义

    <!ELEMENT family (parent*, kid*)>
    

    这将验证以下内容(从您在问题中包含的文档中更正)

    <family>
      <parent>
        <name>Bob</name>
        <initial>R</initial>
        <surname>Johnson</surname>
      </parent>
      <kid>
        <name>Lucy</name>
        <surname>Johnson</surname>
      </kid>
    </family>
    

    【讨论】:

    • 哇,我真的只是想这会真正减少我的 DTD,谢谢你的提示,我可以看到它现在可以工作了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多