【问题标题】:Validating XML against DTD in which elements appears in random order根据 DTD 验证 XML,其中元素以随机顺序出现
【发布时间】:2011-06-22 02:51:04
【问题描述】:
<!ELEMENT myxml (first,second,third)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>

上面的 DTD 限制子元素(第一、第二和第三)在 XML 中的顺序相同。有没有什么方法可以让这个 DTD 验证 XML 中的元素是强制性的,但可以以任何顺序出现?

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

    当您需要每个子元素中的一个时,这很棘手。这是我能想到的唯一方法,它不是很漂亮。它虽然有效......

    <!ELEMENT myxml ( 
                     (first,second,third)|
                     (first,third,second)|
                     (second,first,third)|
                     (second,third,first)|
                     (third,first,second)|
                     (third,second,first)
                    )>
    <!ELEMENT first (#PCDATA)>
    <!ELEMENT second (#PCDATA)>
    <!ELEMENT third (#PCDATA)>
    

    基本上,我指定了一个 firstsecondthird 元素的所有可能组合。

    这是一个示例。 firstsecondthird 可以按任意顺序排列,但它们都必须恰好出现一次。

    <!DOCTYPE myxml [
    <!ELEMENT myxml ( 
                     (first,second,third)|
                     (first,third,second)|
                     (second,first,third)|
                     (second,third,first)|
                     (third,first,second)|
                     (third,second,first)
                    )>
    <!ELEMENT first (#PCDATA)>
    <!ELEMENT second (#PCDATA)>
    <!ELEMENT third (#PCDATA)>
    ]>
    <myxml>
      <third></third>
      <first></first>
      <second></second>
    </myxml>
    

    【讨论】:

      【解决方案2】:
      <!ELEMENT myxml (first|second|third)*>
      <!ELEMENT first (#PCDATA)>
      <!ELEMENT second (#PCDATA)>
      <!ELEMENT third (#PCDATA)>
      

      不过,上述内容并不是很有用。您更有可能需要至少一个孩子,如下所示:

      <!ELEMENT myxml (first|second|third)+>
      <!ELEMENT first (#PCDATA)>
      <!ELEMENT second (#PCDATA)>
      <!ELEMENT third (#PCDATA)>
      

      【讨论】:

      • 使用+ 出现指示器的唯一问题是您指定了一个或多个子元素。这意味着您可以拥有类似 2 个 second 元素,仅此而已。我认为 OP 希望确保每个元素都存在并且只出现一次。
      • 我不清楚所有元素都是强制性的。对此感到抱歉。
      • 不用担心。我只是说';-)
      【解决方案3】:

      在 XML DTD 中,没有优雅的方式来指定这个约束。您可以按照@DevNull 的建议进行操作;这是合法的,但是当元素数量很大时,该技术变得笨拙。

      如果这是关于 SGML DTD,那么您可以使用 &amp; (AND) connector。但这是创建 XML 时 removed 的功能之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        • 2011-11-23
        • 2015-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        相关资源
        最近更新 更多