【问题标题】:Pros/Cons for containers for child nodes in XML?XML 中子节点容器的优缺点?
【发布时间】:2010-11-03 21:27:57
【问题描述】:

我注意到不同的 XML 模式对子元素的定义不同。有些直接在父节点下定义它们,如下所示:

<parent>
    <foo />
    <foo />
    ...
    <foo />
    <bar />
    <bar />
    ...
    <bar />
</parent>

其他人在子节点周围定义容器节点,如下所示:

<parent>
    <foos>
        <foo />
        <foo />
        ...
        <foo />
    </foos>
    <bars>
        <bar />
        <bar />
        ...
        <bar />
    </bars>
</parent>

我没有遇到任何必要的序列化/反序列化为任何一种格式的问题,我想不出任何理由更喜欢其中一种。

每种方法的优缺点是什么(如果有的话)?

【问题讨论】:

    标签: xml schema


    【解决方案1】:

    嗯,第二个更“直观”。更有层次感。比如你有这个:

    <animal>
     <snakes>
       <boa />
       <python />
     </snakes>
     <monkeys>
       <red_ass_monkey />
       <yellow_monkey />
     </monkeys>
    </animal>
    

    当您的对象以某种方式与层次结构联系在一起时,我肯定会选择第二个,因为它更合乎逻辑。此外,当您阅读自己以直接在 xml 中修改某些内容时(以防万一),您会发现自己的方式更好,因为知道蟒蛇是一种动物的蛇(当事情变得复杂时,这比在整体中搜索要好)列表。

    【讨论】:

      【解决方案2】:

      第一个方案是可扩展的,实现起来并不难,您只需遍历所有 childNodesparent 并查看名称空间和元素名称是否与您可以读取的任何内容匹配。但是,有时,拆分可能是有利的,尤其是当处理bars 依赖于所有foos 左右时。

      借用一个例子:

      <zoo xmlns="http://example.org/zoo" xmlns:z="http://example.org/zoo">
      <cages>
        <cage name="open-air" />
        <cage name="glass-cage" />
      </cages>
      <animals>
        <monkey name="Orlan" cage="open-air"/>
        <monkey name="Jeremey" cage="glass-cage"/>
        <snake name="spssshs" cage="glass-cage"/>
        <panda xmlns="http://china.cn/zoo" z:name="Ying Ying" z:cage="open-air"/>
      </animals>
      </zoo>
      

      因此,将cagesanimals 分开是有意义的。但是,如果您将动物分组为猴子和蛇,则需要为 pandas 添加大量额外的处理逻辑。

      【讨论】:

      • 当处理bars依赖foos时,添加容器节点有什么帮助?在您的示例中,您不能先处理笼子节点而不将它们包装在笼子节点中吗?
      • @micahthan 是的,但前提是您在进行任何解析之前加载了完整的文档,这样您就可以有效地排除使用串行访问解析器的任何人。此外,即使您首先加载整个文档,处理也会变得更加复杂和缓慢:您通常会遍历整个树两次,并且还需要与命名空间进行两次比较。
      • @phihag - 我不能定义 XSD 以使用序列来强制所有 元素开始,在这种情况下,您仍然可以获得串行解析的好处,而无需包装 元素内的 元素?
      • @micahtan 当然你可以要求这样做,但这会 1. 增加编码复杂性(你必须查看下一个元素直到它是 !cage) 2. 很难添加动物园管理员(在笼子之前还是之后?) 3. 创建不兼容性,因为某些实现会错误地接受乱序笼子(并且不检查任何模式) 4. 为自动 native2xml 转换带来额外的问题,您必须告诉您尊重该顺序。
      • @phihag,我理解你的意思,但是当你遇到像上面的 akf 帖子这样的场景时,你又回到了迭代所有 容器节点。 +1 您最初的评论和持续的讨论 - 可扩展性受到您原始​​节点分组的限制,并且不允许非常优雅地进行更改。
      【解决方案3】:

      如果您需要将一些 &lt;foo/&gt;s 组合成一个重复集,则这种结构的一种可能性是:

      `

      <foos id=1>
          <foo />
          <foo />
          ...
          <foo />
      </foos>
      <foos id=2>
          <foo />
          <foo />
          ...
          <foo />
      </foos>
      

      `

      【讨论】:

      • +1 好点。除非我想添加属性/元素,否则无法区分名称相似的节点组
      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多