2014-10-16 51 views
0

鑑於形式的傳統輸入XML文件子節點:使用Javascript遍歷XML文件中使用的JavaScript的XPath

<?xml version="1.0" ?> 
<data> 
<map> 
    <key>title</key> 
    <string>A Title Here</string> 

    <key>description</key> 
    <string>Description goes here</string> 

    <key>elements</key> 

    <map> 
     <key>item1</key> 
     <map> 
     <key>name</key> 
     <string>foo</string> 
     <key>url</key> 
     <string>http://foo.com</string> 
     </map> 

     <key>item2</key> 
     <map> 
     <key>name</key> 
     <string>bar</string> 
     <key>url</key> 
     <string>http://bar.com</string> 
     </map> 

     <key>item3</key> 
     <map> 
     <key>name</key> 
     <string>flasm</string> 
     <key>url</key> 
     <string>http://flasm.com</string> 
     </map> 

    </map> 
</map> 

,我想找到的「元素」標籤(不總是在同一個地方),然後遍歷所有的子項('item'N)併爲每個子項收集鍵/字符串對(例如「name = foo」)

我試過用DOMReader和Xpath但一直未能完全正確。

任何人都可以告訴我如何做到最好?

(這看起來不像我見過的其他XML,所以也許這就是爲什麼我在我找到的例子中遇到問題的原因,但正如我所說,這是遺留問題,我無法控制它) 。

非常感謝。

+0

這看起來像是我的Apple配置文件。從'元素'開始將在其中間開始或多或少。你確定你要這麼做嗎?更好的方法是從名爲'A Title Here'的地圖'元素'開始。 – 2014-10-17 07:11:55

+0

沒有理由我不能從頂部開始,並測試一個關鍵是否'元素',然後從那裏開始迭代。 – speedwell 2014-10-17 18:15:27

回答

1

我不完全確定你的意思是「不總是在同一個地方」,如果你能詳細說明我可以提供更好的答案。但是,如果「元素」和它的孩子(在你的榜樣,「ItemN」是不是一個孩子,而是一個兄弟姐妹)可以被不同地嵌套,你可以通過只是文本內容,像這樣搜索:

//*[contains(text(), 'elements')]/following-sibling::map/key[contains(text(), 'item1')]/following-sibling::map[1] 

這如果您要查找的子節點實際上是您的示例中的下一個直接兄弟節點,則爲您提供要查找的對。

+0

謝謝JWiley - 我的意思是'元素'鍵不一定遵循'描述'鍵。 這似乎工作得很好 - 2個問題: 1 /我不知道有多少項目 - 我可以找回所有的迭代器嗎? 2 /訪問'item n'的孩子的語法是什麼 - 說另一個地圖或值?我是否使用基於第一個迭代器的另一個XPath語句? < – speedwell 2014-10-24 00:49:24