在解析 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