XML中子节点容器的优缺点?

XML中子节点容器的优缺点?,xml,schema,Xml,Schema,我注意到不同的XML模式对子元素的定义不同。有些直接在父节点下定义它们,如下所示: <parent> <foo /> <foo /> ... <foo /> <bar /> <bar /> ... <bar /> </parent> <parent> <foos> <foo />

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

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

...
...
其中,与其他人一样,在子节点周围定义容器节点,如下所示:

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

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


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

嗯,第二种方法更“直观”。更具层次性。例如,您有一个:

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


我肯定会选择第二个,当你的对象以某种方式被链接时,因为它更符合逻辑。另外,当您阅读自己直接在xml中修改某些内容(以防万一)时,您会发现自己的方法更好,因为您知道python是一条蛇,是一种动物(当事情变得复杂时,比在整个列表中搜索更好。

这种结构的一种可能性是,如果您需要将一些
组合到一个重复集合中:

`


...
...

`

第一个方案是可扩展的,不难实现,您只需迭代
父节点的所有
子节点
,然后查看名称空间和元素名称是否匹配您可以读取的任何内容。然而,有时,拆分可能是有利的,尤其是当
条的处理取决于所有
foo
左右时

借用一个例子:

<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>


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

当处理条依赖于foos时,添加容器节点有何帮助?在您的示例中,您不能先处理cage节点而不将其包装到cages节点吗?@micahthan是的,但前提是您在执行任何解析之前加载完整的文档,因此您可以有效地排除使用串行访问解析器的任何人。此外,即使您首先加载完整文档,处理也会变得更加复杂和缓慢:您通常会遍历整个树两次,并且还需要两次对名称空间的比较。@phihag-我不能定义XSD以使用序列强制所有元素从头开始吗,在这种情况下,您仍然可以获得串行解析的好处,而不必将元素包装到元素中?@micahtan您当然可以要求这样做,但那将是1。增加编码的复杂性(你必须窥视下一个元素,直到它变成!cage)2。很难添加动物园管理员(在笼子之前还是之后?)。创建不兼容,因为某些实现会错误地接受无序的框架(而不检查任何模式)4。为自动native2xml转换带来额外的问题,您必须告知以遵守该顺序。@phihag,我理解您的观点,但当您遇到类似于上述akf帖子的场景时,您又回到了对所有容器节点的迭代+1您最初的评论和继续的讨论--可扩展性受到原始节点分组的限制,不允许非常优雅地进行更改。+1好的一点。除非我想添加一个属性/元素,否则无法区分名称相似的节点组