XPath可以快速定位到Xml中的節點或屬性。 XPath語法很簡單,但是強大夠用,它也是使用xslt的基礎知識。
範例Xml:
<?xml version="1.0" encoding="utf-8" ?> <pets> <cat color="black" weight="10"> <price>100</price> <desc>this is a black cat</desc> </cat> <cat color="white" weight="9"> <price>80</price> <desc>this is a white cat</desc> </cat> <cat color="yellow" weight="15"> <price>80</price> <desc>this is a yellow cat</desc> </cat> <dog color="black" weight="10"> <price>100</price> <desc>this is a black dog</desc> </dog> <dog color="white" weight="9"> <price>80</price> <desc>this is a white dog</desc> </dog> <dog color="yellow" weight="15"> <price>80</price> <desc>this is a yellow dog</desc> </dog> </pets>
XPath的語法:
符號
| 例 | 範例說明 | / | 表示從根節點開始選擇 | /pets s | 表示節點和子節點之間的間隔符 | |||||||||||||||||||||||||||||||||||||||||||
/pets/dog
節點下的 | | ||||||||||||||||||||||||||||||||||||||||||||||||
//xx |
| //price | 選擇文件中所有的price節點 節點 | ||||||||||||||||||||||||||||||||||||||||||||||
| /pets/. | 選擇pets .. | |||||||||||||||||||||||||||||||||||||||||||||||
雙點,表示選擇父節點 | /pets/dog[0]/.. /pets/dog[0]/.. | 表示pets節點,也就是第一個dog節點的父節點 | |||||||||||||||||||||||||||||||||||||||||||||||
| 表示選擇屬性//dog/@color
| 屬性集合
| |||||||||||||||||||||||||||||||||||||||||||||||
[…] 號 | //dog[@color ='white'] | 所有 color 為white | //dog[/price<100 ]所有price字節點值小於100的dog節點 號。 | ,||||||||||||||||||||||||||||||||||||||||||||||
開始的 //dog[1] | 第1個dog節點 | ||||||||||||||||||||||||||||||||||||||||||||||||
最後一個 last() | 內建函數 | 單豎槓表示合併節點結合 | //dog[@color='white' color | 的dog 節點和color屬性為white的節點和color屬性為white *
| |||||||||||||||||||||||||||||||||||||||||||||
星號表示任何名字的節點或屬性 | //dog/* |
| |||||||||||||||||||||||||||||||||||||||||||||||
表示 |
範例 | 範例說明 | ancestor | ||||
目前節點的父祖節點 | ancestor::pig 的pig | ancestor-or-self | ||||
|
| attribute | attribute目前節點的所有屬性 | attribute::weight attribute::weight | attribute::和 @ 是等價的
| |
選名字不是price的子節點 | ||||||
子孫節點 | descendant::*[@*] | 有屬性的子孫節點 |
| |||
descendant-or-self::* |
| |||||
Xml 文件中當前節點之後的所有節點 | following::*
| following-sibling | 當前節點的同父弟弟節點 | following-sibling:: | | |
Xml | preceding::* |
| | 選取目前節點的所有命名空間節點|||
namespace::* |
| |||||
|
| 目前節點的父節點
| parent:: | |||
preceding-sibling | 當前節點之後的同父兄節點 |
| self | |||
當前節點 | 相當於單點 . | 5. 常用的XPath函数介绍: 在XPath表达式中常用的函数有下面两个: position() 表示节点的序号例如 //cat[position() = 2] 表示取序号为2的dog节点 last() 表示取最后一个节点 //cat[last()] name() 表示当前节点名字 /pets/*[name() != 'pig'] 表示/pets下名字不是pig的子节点 登入後複製 XPath的函数还有很多,包括字符串函数,数字函数和时间函数等,具体可以参考w3的网站。 以上是XPath的语法,下面我们看下如何在.Net中使用XPath 在.Net中可以通过XPathDocument或者XmlDocument类使用XPath。XPathDocument是只读的方式定位Xml节点或者属性文本等,而XmlDocument则是可读写的。 如下代码示例展示了如何使用XPathDocument和XmlDocument。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.XPath; using System.Xml; namespace UseXPathDotNet { class Program { static void Main(string[] args) { UseXPathWithXPathDocument(); UseXPathWithXmlDocument(); Console.Read(); } static void UseXPathWithXmlDocument() { XmlDocument doc = new XmlDocument(); doc.Load("http://www.cnblogs.com/yukaizhao/rss"); //使用xPath选择需要的节点 XmlNodeList nodes = doc.SelectNodes("/rss/channel/item[position()<=10]"); foreach (XmlNode item in nodes) { string title = item.SelectSingleNode("title").InnerText; string url = item.SelectSingleNode("link").InnerText; Console.WriteLine("{0} = {1}", title, url); } } static void UseXPathWithXPathDocument() { XPathDocument doc = new XPathDocument("http://www.cnblogs.com/yukaizhao/rss"); XPathNavigator xPathNav = doc.CreateNavigator(); //使用xPath取rss中最新的10条随笔 XPathNodeIterator nodeIterator = xPathNav.Select("/rss/channel/item[position()<=10]"); while (nodeIterator.MoveNext()) { XPathNavigator itemNav = nodeIterator.Current; string title = itemNav.SelectSingleNode("title").Value; string url = itemNav.SelectSingleNode("link").Value; Console.WriteLine("{0} = {1}",title,url); } } } } 登入後複製 XPath使用示例,请看下面的代码注释 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Xml; namespace UseXPath1 { class Program { static void Main(string[] args) { string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <pets> <cat color=""black"" weight=""10"" count=""4""> <price>100</price> <desc>this is a black cat</desc> </cat> <cat color=""white"" weight=""9"" count=""5""> <price>80</price> <desc>this is a white cat</desc> </cat> <cat color=""yellow"" weight=""15"" count=""1""> <price>110</price> <desc>this is a yellow cat</desc> </cat> <dog color=""black"" weight=""10"" count=""7""> <price>114</price> <desc>this is a black dog</desc> </dog> <dog color=""white"" weight=""9"" count=""4""> <price>80</price> <desc>this is a white dog</desc> </dog> <dog color=""yellow"" weight=""15"" count=""15""> <price>80</price> <desc>this is a yellow dog</desc> </dog> <pig color=""white"" weight=""100"" count=""2""> <price>8000</price> <desc>this is a white pig</desc> </pig> </pets>"; using (StringReader rdr = new StringReader(xml)) { XmlDocument doc = new XmlDocument(); doc.Load(rdr); //取所有pets节点下的dog字节点 XmlNodeList nodeListAllDog = doc.SelectNodes("/pets/dog"); //所有的price节点 XmlNodeList allPriceNodes = doc.SelectNodes("//price"); //取最后一个price节点 XmlNode lastPriceNode = doc.SelectSingleNode("//price[last()]"); //用双点号取price节点的父节点 XmlNode lastPriceParentNode = lastPriceNode.SelectSingleNode(".."); //选择weight*count=40的所有动物,使用通配符* XmlNodeList nodeList = doc.SelectNodes("/pets/*[@weight*@count=40]"); //选择除了pig之外的所有动物,使用name()函数返回节点名字 XmlNodeList animalsExceptPigNodes = doc.SelectNodes("/pets/*[name() != 'pig']"); //选择价格大于100而不是pig的动物 XmlNodeList priceGreaterThan100s = doc.SelectNodes("/pets/*[price p @weight >10 and name() != 'pig']"); foreach (XmlNode item in priceGreaterThan100s) { Console.WriteLine(item.OuterXml); } //选择第二个dog节点 XmlNode theSecondDogNode = doc.SelectSingleNode("//dog[position() = 2]"); //使用xpath ,axes 的 parent 取父节点 XmlNode parentNode = theSecondDogNode.SelectSingleNode("parent::*"); //使用xPath选择第二个dog节点前面的所有dog节点 XmlNodeList dogPresibling = theSecondDogNode.SelectNodes("preceding::dog"); //取文档的所有子孙节点price XmlNodeList childrenNodes = doc.SelectNodes("descendant::price"); } Console.Read(); } } } 登入後複製 以上是XPath語法: 在C#中使用XPath範例的具體程式碼介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
Nuxt 3在SSR中無法渲染
所以我遇到了一個問題,我正在嘗試取得我的私有環境變數。我知道只有在我的頁面是ssr時才能獲取它們。問題是我從來沒有禁用過它。我在我的頁面中記錄了console.log(proces...
來自於 2024-04-05 15:04:40
0
1
3642
使用vite建構React應用程式時遇到的Axios相關錯誤
Axios在生產環境中工作得完美,但在建立應用程式時出現了這個錯誤。 >react-app@0.0.0build>vitebuildvitev4.4.7正在為生產環境建...
來自於 2024-04-05 13:20:02
0
1
326
我該如何調整這些卡,使其能夠使用 Boostrap 4 做出回應?
如何讓每個row顯示4張卡片,當然,如果螢幕尺寸發生變化,則使它們堆疊起來。理想情況下,它們之間應該有一些空間。我已經嘗試了我能研究的所有可能的組合。 #cardsContaine...
來自於 2024-04-05 10:48:45
0
1
4072
CommandText屬性初始化問題
我正在嘗試使用C#控制台應用程式同時將資料實現到2個(後來是3個)表中。我想在表格「用戶」中實現名字、姓氏和用戶ID,用戶ID將自動遞增。同樣的userID也應該與porilfeI...
來自於 2024-04-04 22:43:24
0
1
385
使用視窗函數將最高值新增為一列
我有一個如下表:複製資料的查詢:DROPTABLEIFEXISTSunits_table;CREATETEMPTABLEunits_table(Brandvarchar(100),...
來自於 2024-04-04 12:18:16
0
2
405
熱門教學
更多>
|