分類
程式技術

XPath學習

在解析 xml 資料時, 若只是取出一些固定欄位資料, 除了用 regular expression 或是指令字串比對方式外, 利用 XPath 來操作算是比較正規的作法.

有效利用 XPath 可以快速地選擇到需要查詢出來的資料, 而且更正確更有效地取出資料. 例如想要取出下面資料(bb.xml):

<root>
  <app>
    <name>test1</name>
    <tick>20</tick>
    <pt>12</pt>
  </app>
  <app>
    <tick>test2</tick>
    <value>32</value>
    <pt>15</pt>
  </app>
</root>

若要取出的是 app name=test1 的資料, 並讀出 value 的方式, 可以如下操作(以asp/vbs為例):

Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")

xmlhttp.Open "GET", "http://localhost/bb.xml", False
xmlhttp.Send  

Set root = xmlhttp.responseXML
Set app = root.selectSingleNode("//app[name=""test1""]")
Set tick = app.selectSingleNode("//tick")
Response.Write tick.text

也就是利用 XPath 的 //app[name=”test1″] 來取出 app node 內容有 name 值是 test1 的 node 出來, 之後再利用 //tick 將該 node 下的 tick node 取出, 再用 text 讀出該值為 20.

若只需要取出 value 的值, 而不是要將 app node select 出來使用, 可以一行搞定, 如下:

Response.Write root.selectSingleNode("//app[name=""test1""]//tick").text

這樣操作很快也很有效, 而且可以找對各節點的關連關係. 在操作 xml 時, 得要好好學習的一個工具.

參考資料:
http://www.w3schools.com/xpath/xpath_syntax.asp
http://zvon.org/xxl/XPathTutorial/General/examples.html
http://msdn.microsoft.com/en-us/library/d271ytdx.aspx

[2011/9/16 17:23]
補充若有 xmlns (xml namespace) 的狀況下, 取不出 node(s) 的問題:
http://www.dotblogs.com.tw/rainmaker/archive/2011/09/16/36457.aspx

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *