2009-06-18 30 views
2

我注意到不同的XML模式定义子元素的方式不同。有的直接定义他们的父节点下,像这样:用于XML中子节点容器的优点/缺点?

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

其中为其他人限定围绕子节点容器节点像这样:

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

我已经没有任何问题,序列化/反序列化到任何格式是必要的,我想不出有什么理由相互倾向。

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

回答

1

好了,第二个是更多的“直觉”。更分层次。比如你有这样的一个:

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

我肯定会选择当你的对象是莫名其妙hirearchical连接第二个,因为它更符合逻辑。另外,当你读自己在xml中直接修改某些东西时(以防万一),你会发现你的方式更好,因为知道一条Python是一条蛇(它是一个当事情变得复杂的时候),比在整体中搜索更好名单。如果你需要组

1

一种可能性为这样的结构将是一些<foo/>š在一起成为一个重复组:

`

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

`

+1

+1好点。除非我想添加属性/元素,否则无法区分具有相似名称节点的组。 – micahtan 2009-06-18 16:34:03

1

第一种方案是可扩展的和没有那么难实现,您只需遍历parent的所有childNodes并查看命名空间和元素名称是否匹配您可以读取的任何内容。但是,有时候,分割可能是有利的,特别是当处理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很有意义。但是,如果您将动物分组为猴子和蛇,则需要为熊猫添加大量额外的处理逻辑。

+0

当处理栏取决于foos时,如何添加容器节点有帮助?在你的例子中,你能不能先处理笼子节点,而不是将它们包装在笼子节点中? – micahtan 2009-06-18 16:31:52

+0

@micahthan是的,但只有在进行任何解析之前加载完整文档,才能有效排除使用串行访问解析器的任何人。另外,即使无论如何首先加载完整文档,处理变得更复杂和更慢:您通常会遍历整个树两次,并且也需要对命名空间进行两次比较。 – phihag 2009-06-18 16:52:54

+0

@phihag - 我不能定义XSD使用顺序来强制所有元素开始,在这种情况下,你仍然可以得到串行分析的好处W/O不必包扎元素内的元素? – micahtan 2009-06-18 19:23:43