C# – XPath

XPath 簡單來說就是一種簡易的搜尋語法
請參閱 w3c 上的<XML 路徑語言 (XPath) 1.0 版>
Wikipedia – XPath

就拿之前在寫的系統設定程式做個比較
這是我們系統參數的 xml 檔的部分內容:

 <?xml version="1.0" encoding="UTF-16"?>
 <DeviceSetting>
  <Graphic>
    <Set key="Adapter" value="0" type="int" />
    <Set key="NVPerfHUD" value="False" type="bool" />
    <Set key="RequestedVP" value="HAL" type="string" />
    <Set key="Antialiasing" value="8" type="int" />
  </Graphic>

  <Sound>
    <Set key="Channels" value="2" type="int" />
    <Set key="Freq" value="22050" type="int" />
    <Set key="Bitrate" value="8" type="int" />
  </Sound>

  <Input>
    <Set key="UseJoypad" value="True" type="bool" />
    <Set key="JoypadExclusive" value="True" type="bool" />
  </Input>
 </DeviceSetting>

在套用 XPath 語法之前,只能走訪每個相關元素去尋找我要的節點。
尋找節點的方法宣告:

 private XmlNode nGetNodeByKey(string key);

方法內容:

 XmlNodeList nodeList;
 
 // Graphic 部分

 nodeList = this._XRoot.SelectSingleNode("Graphic").SelectNodes("Set");
 foreach ( XmlNode xn in nodeList )
 {
     if (xn.Attributes["key"].Value == key)
         return xn;
 }

 // Sound 部分
 nodeList = this._XRoot.SelectSingleNode("Sound").SelectNodes("Set");
 foreach ( XmlNode xn in nodeList )
 {
     if (xn.Attributes["key"].Value == key)
         return xn;
 }

 // Input 部分
 nodeList = this._XRoot.SelectSingleNode("Input").SelectNodes("Set");
 foreach ( XmlNode xn in nodeList )
 {
     if (xn.Attributes["key"].Value == key)
         return xn;
 }

很顯然的,我同樣都是在找三大項裡面的 Set 節點,就如此大費周章了
當然,可能我用的方法比較蠢XD

那麼,如果套上 XPath 語法呢?

 return this._XRoot.SelectSingleNode( ".//Set[@key='" + key + "']" );

※這邊我用「'」把字串包起來,所以上面三個點連在一起,實際上是由「'」「"」所構成。

就如此簡單!這一行和上面N行的結果是一模一樣的。
甚至連這個尋找節點的方法都可以整個 Del 掉了!
XPath 重要嗎?太重要了
(好吧~這是個人觀感)




XPath 的語法我是參考 MSDN上的資料,連結在此
其中最簡單的方式就是看他底下的 XPath 範例

這邊就解是一下我上面的用法…
首先可將整個字串,拆解成
「.」「//」「Set」「[]」「@key」「'key
「.」 指的是目前的內容,就是上面的 this._XRoot 這個節點底下的內容。
「//」指的是底下一個或數個階層。
「Set」指的是節點的名稱。
「[]」指的是篩選條件,可以多個一起用。
「@key」指的是該節點的 key 屬性
「'key'」指的是比較的內容。

所以,整串的解釋就是:「尋找目前底下所有名為 Set 的節點,並且該節點的 key 屬性等同於 'key'。
由於我是使用 SelectSingleNode ,所以只會回傳第一個符合內容的節點
嗯…就是這樣

–End

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s