2009-06-18 50 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