代码之家  ›  专栏  ›  技术社区  ›  Mat

列表应该如何用XML表示?

  •  7
  • Mat  · 技术社区  · 16 年前

    在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>
    
    8 回复  |  直到 16 年前
        1
  •  7
  •   Jason Jackson    16 年前

    对于可扩展性,我将使用第一个解决方案(具有 儿童 节点)。如果您希望存储关于所有子节点的任何数据,那么您就有了一个方便的节点,可以在该节点上放置属性。

        2
  •  7
  •   Daniel A. White    16 年前

    我将把它放在一个实体中,以区别于其他元素。

        3
  •  2
  •   Greg Beech    16 年前

    如果列表中元素的名称总是相同的,这并没有多大区别,因为如果使用xpath或linq-to-xml或其他方法处理它,那么如果存在包装节点,查询将只具有一个选择器,否则将是相同的。

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

    所以这可能并不重要,但我倾向于使用包装器元素,因为它从视觉上描述了集合中的项与非集合中的项。

        4
  •  2
  •   Kenan Banks    16 年前

    想一想你想用代码写下它。

    对我来说…

    spouse.children = person.children...
    

    在语义上比…

    for child in person:
        spouse.addChild(person.child)
    
        5
  •  1
  •   Mehrdad Afshari    16 年前

    第一个对于简单的列表来说很好,但是如果列表本身包含一个嵌套的列表呢?!如果一个元素有几个不同的列表呢?为了保持一致,我更喜欢列表中的元素并使用 <item> 标记或用于子数据的内容。这将有助于使用通用函数解析所有列表。

        6
  •  1
  •   Dimitre Novatchev    16 年前

    如果我们需要 普遍的 列表的XML表示,我们将得出这样的结论:必须使用以下一种表示 :

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

    让我们分析一下 :

    1. 这个 <_listSomeName> 包装器元素是必需的,因为我们可能有两个或多个列表作为元素的子列表,并且必须能够唯一且方便地标识每个列表。“somename”部分用于使列表的名称唯一。

    2. 这个 <_listItem> 需要元素来包装每个单独的列表项。它不能被省略,因为列表项可以有一个复杂的结构(例如XML片段本身),并且很难将其标识为一个整体。

        7
  •  1
  •   stevenvh    16 年前

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

        8
  •  0
  •   Daniel Schaffer    16 年前

    嗯,这取决于域名。

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

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