【问题标题】:How should a list be represented in XML?列表应该如何用 XML 表示?
【发布时间】:2010-10-01 17:33:30
【问题描述】:

在XML中,列表应该如何表示?

带有封闭列表实体:

<person>
    <firstname>Joe</firstname>
    <lastname>Bloggs</lastname>

    <children>
        <child .../>
        <child .../>
        <child .../>
        <child .../>
        <child .../>
    </children>
</person>

或者没有:

<person>
    <firstname>Joe</firstname>
    <lastname>Bloggs</lastname>

    <child .../>
    <child .../>
    <child .../>
    <child .../>
    <child .../>
</person>

【问题讨论】:

    标签: xml list


    【解决方案1】:

    为了可扩展性,我会使用第一个解决方案(带有 children 节点的解决方案)。如果您希望存储有关所有孩子的任何数据,那么您有一个方便的节点来放置属性。

    【讨论】:

    • 好点。我可以想到孩子的属性......配偶......所以如果孩子来自另一个婚姻。
    【解决方案2】:

    我会将它封装在一个实体中以将其与其他元素区分开来。

    【讨论】:

    • 同意 Jason Jackson 下面列出的原因。
    • 另外,你可以有 .. .. 如果您使用封闭实体,您可以拥有不同类型的孩子的列表。
    【解决方案3】:

    如果列表中元素的名称始终相同,这并没有太大的区别,因为如果您使用 XPath 或 Linq-to-XML 或其他任何方式处理它,那么查询将只有如果有包装器节点,则多一个选择器,否则将是相同的。

    另一方面,如果列表中的元素名称可能不同,那么如果有一个包装元素,它可以使处理列表更容易,因为您可以只使用 '*' 作为列表元素下方的选择器,而不是使用将所有元素过滤为具有指定名称集的元素。

    所以它可能并不重要,但我倾向于使用包装元素,因为它在视觉上将集合中的项目与不存在的项目区分开来。

    【讨论】:

      【解决方案4】:

      在您想针对它编写的代码中考虑它。:

      对我来说……

      spouse.children = person.children...
      

      在语义上比...好很多

      for child in person:
          spouse.addChild(person.child)
      

      【讨论】:

        【解决方案5】:

        第一个很适合简单的列表,但是如果列表本身包含一个嵌套列表呢?!如果一个元素有几个不同的列表怎么办?为了保持一致,我更喜欢列表的元素,并使用&lt;item&gt; 标记或其他内容作为子数据。这将有助于使用通用函数来解析所有列表。

        【讨论】:

          【解决方案6】:

          如果我们需要一个列表的通用 XML 表示,我们将得出结论,必须使用以下一种表示

          <_listSomeName>
            <_listItem>...</_listItem>
            <_listItem>...</_listItem>
            <_listItem>...</_listItem>
            <_listItem>...</_listItem>
            <_listItem>...</_listItem>
          </_listSomeName>
          

          我们来分析一下

          1. 需要 &lt;_listSomeName&gt; 包装元素,因为我们可能有两个或多个列表作为元素的子元素,并且必须能够唯一且方便地标识每个列表。 “SomeName”部分用于使列表的名称独一无二。

          2. 需要 &lt;_listItem&gt; 元素来包装每个单独的列表项。它不能省略,因为列表项可能具有复杂的结构(例如本身就是一个 xml 片段),并且很难将其识别为一个整体。

          【讨论】:

            【解决方案7】:

            我会使用第一个解决方案。该列表具有语义相关性:它是相似元素的集合,因此应该是可识别的。在第二种解决方案中,列表不作为元素存在。

            【讨论】:

              【解决方案8】:

              恕我直言,这取决于域。

              对于您给出的示例,我会使用实体来包围孩子,因为孩子本身不一定是人的属性,但孩子的列表是。

              此外,如果您需要序列化/反序列化,使用附件会有所帮助。

              【讨论】:

                猜你喜欢
                • 2011-11-28
                • 1970-01-01
                • 1970-01-01
                • 2011-10-06
                • 1970-01-01
                • 1970-01-01
                • 2016-03-12
                • 2019-01-14
                相关资源
                最近更新 更多