2012-01-30 34 views
0

如何使用NSXMLParser解析嵌套節點。由於該解析器知道解析XML節點式的方式,我們應該如何處理多個節點中包含相同的名稱解析:nsxmlparser一個接一個地解析?

<data> 
    <nodesame attrisame="this is same"> 
     <nodesame> this is also same </nodesame> 
     <nodedifferent> this is different although </nodedifferent> 
    </nodesame> 
</data> 

在上面我們有一個包含nodesame節點包含另一個nodesame節點的主數據節點內。請告訴我如何區分兩個節點名稱與不同的上下文。

請建議我一些很好的方法用於獲取從委託字典/陣列:

parser:didEndElement:namespaceURI:qualifiedName 

我famaliar與libxml2和touchXML但使用的NSXMLParser是讓我瘋狂此外,我們還使用相同的,因爲我們使用的代碼使用NSXMLParser,因此將其更改爲Libxml將會非常糟糕。

回答

0

當您使用nsxmlparser時,它從上到下,並調用匹配對didStartElementdidEndElement。因此,對於你的第一個問題(如何知道你在什麼時候與一個父節點同名的子節點?),答案是跟蹤調用didStartElement的時間,然後是另一個具有相同節點名稱的didStartElement撥打電話didEndElement

現在,每個元素都被命名,所以一個數組不適用於常規分析。它只有在JSON響應中才是可行的。 因此,對於第二個問題(如何創建xml的數組或字典?),是讓每個節點成爲自己的字典,也許使用另一個字典的「屬性」鍵。我想創建這樣的事情您例如:

{"data": 
    {"nodesame": 
     {"attributes": 
      {"attrisame":"this is same"} 
     }, {"nodesame": 
       {"text":"this is also same"} 
     }, {"nodedifferent": 
       {"text":"this is different although"} 
     } 
    } 
} 

一個問題在這裏被佔用的話「屬性」和「文字」,所以它不是一個漂亮的解決方案。

+0

所以我需要保持每次的增量,導致現在我每次分配時didEndElement調用,所以舊的數據被刪除,新的陣列分配。 – aksani56 2012-01-30 11:21:02

+0

你可以這樣做,當然。因此,如果進入'didStartElement'並且名稱是「nodesame」,則您執行+1,如果進入'didEndElement'並且名稱是「nodesame」,則執行-1。每當計數器爲1時,你處於第二級,每當它爲0時,你就處於第一級。 – vakio 2012-01-30 12:20:10

+0

感謝@vakio工作得像真棒! – aksani56 2012-01-31 07:21:51