재인쇄: //m.sbmmt.com/
C#에서는 노드를 검색하고 순회하는 경우가 많습니다. 이것이 바로 XPath를 사용하는 것입니다. 구문, 예
기호 |
설명 | 예 |
설명 예시
| < /tr>||||||||||||||||||||||||||||||||||||||||||||||||
<🎜><🎜>/<🎜>< 🎜> | <🎜>은 루트 노드에서 선택하는 것을 의미합니다<🎜> | <🎜 >/pets<🎜> | <🎜>루트 노드 애완동물 선택<🎜> | ||||||||||||||||||||||||||||||||||||||||||||||||
<🎜>노드와 하위 노드 사이의 관계를 나타냅니다. <🎜> | <🎜>/pets/ 사이의 공백 dog<🎜> | <🎜>pets 노드 아래의 dog 노드 선택<🎜> | |||||||||||||||||||||||||||||||||||||||||||||||||
<🎜><🎜>//xx<🎜> <🎜> | <🎜>는 전체 XML에서 검색하는 것을 의미합니다. 문서, 현재 노드 위치에 관계없이 <🎜> | <🎜>//price<🎜> | <🎜>문서에서 모든 가격 노드를 선택하세요<🎜> | ||||||||||||||||||||||||||||||||||||||||||||||||
<🎜><🎜>.<🎜 ><🎜> | <🎜>단일 영어 반자 마침표는 현재 노드 선택을 나타냅니다.<🎜> | <🎜>/pets/.<🎜> | <🎜>애완동물 노드 선택<🎜> | ||||||||||||||||||||||||||||||||||||||||||||||||
<🎜><🎜>..< 🎜><🎜> | <🎜> 상위 노드 선택을 나타내는 이중 점<🎜> | <🎜>/pets/dog[0]/..<🎜> | < td valign="top" width="138"><🎜>는 첫 번째 dog 노드 부모 노드인 애완동물 노드를 나타냅니다.<🎜>|||||||||||||||||||||||||||||||||||||||||||||||||
<🎜><🎜>@xx<🎜><🎜> | <🎜>선택 속성을 나타냅니다<🎜> | <🎜>//dog/@color<🎜> td> | <🎜>색상 속성 선택을 나타냅니다. 모든 개 노드 집합<🎜> | ||||||||||||||||||||||||||||||||||||||||||||||||
<🎜><🎜>[…]<🎜>< 🎜> | <🎜>中 괄호는 선택 조건을 나타내고, 괄호 안의 조건은 <🎜> | <🎜>//dog[@color='white']<🎜> | <🎜>모든 개 노드 흰색<🎜> | ||||||||||||||||||||||||||||||||||||||||||||||||
<🎜>//dog[/price<100]<🎜> | < td valign="top" width="138"><🎜>가격 바이트 값이 100보다 작은 모든 dog 노드<🎜>< /td>|||||||||||||||||||||||||||||||||||||||||||||||||||
<🎜>대괄호 안의 숫자는 노드 인덱스로, C# 등 언어의 배열과 유사하며, 배열 첨자는 1부터 시작합니다<🎜> | <🎜>//dog[1]<🎜> | <🎜>첫 번째 개 노드 <🎜> | |||||||||||||||||||||||||||||||||||||||||||||||||
<🎜>//dog[last()] <🎜> | <🎜>마지막 dog 노드인 last()는 xPath 내장 함수입니다 <🎜> | ||||||||||||||||||||||||||||||||||||||||||||||||||
<🎜>단일 수직 막대는 병합 노드 조합을 나타냅니다<🎜> | <🎜>//dog[@color='white'] //cat[@color='white']<🎜 > | <🎜>색상 속성이 흰색인 개 노드와 색상 속성이 흰색인 고양이 노드<🎜> | |||||||||||||||||||||||||||||||||||||||||||||||||
<🎜><🎜>*<🎜><🎜> | <🎜> 별표는 임의의 이름을 가진 노드 또는 속성을 나타냅니다.<🎜> | <🎜>//dog/*<🎜> | <🎜>dog 노드의 모든 하위 노드를 나타냅니다<🎜> | ||||||||||||||||||||||||||||||||||||||||||||||||
<🎜>// dog/@*<🎜> | <🎜>dog 노드의 모든 속성 노드를 나타냅니다<🎜> |
2. XPath 수학 연산자
+ 더하기 기호는
- 숫자 빼기
*는 곱셈을 의미합니다.
p는 나누기를 의미합니다. 여기서 수학적 나눗셈 기호 /는 노드 사이의 구분 기호로 사용되었습니다.
mod는 나머지를 의미합니다.
3. XPath 논리 연산자
= 같음, c#의 ==
<과 같음 🎜>!= <과 같지 않음 🎜>> 보다 큼
>= 크거나 같음
< 작음
<= 작거나 같음
and 및 관계
or or or 관계
4.
XPath Axes직역하면 다음과 같습니다. XPath 축의 의미이지만 제가 이해한 바에 따르면 이를 XPath 노드 관계 작업 키워드로 번역하는 것이 더 적절합니다. 이는 키워드 집합에 관련 노드 중 하나 또는 그룹을 나타내는 :: 이중 콜론을 더한 것입니다. 현재 노드 사용 구문: 축 이름::nodetest[predicate] 즉, 축 이름::노드 이름 [노드 조건 가져오기]
구체적인 설명은 다음과 같습니다.
키워드 |
|
예 | 설명 예시 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
상위 td> | 현재 노드의 상위 노드 | 조상: :pig | 현재 노드의 조상 노드에 있는 pig 노드 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
현재 노드 및 해당 조상 노드 | 조상::돼지 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
속성 | 모든 속성 현재 노드 | 속성::weight | 은 @weight와 동일하고 attribute:: 및 @는 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
child | 현재 노드의 모든 바이트 포인트 | child::*[name()!='price'] | 이름이 가격이 아닌 하위 노드 선택 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
하위 항목 | 하위 노드 | descendant::*[@*] | 속성이 있는 하위 노드 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
자손 또는 자기 | 하위 노드 및 현재 노드 | descendant- or-self::* | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
다음 | Xml 문서에서 현재 노드 뒤의 모든 노드 | 다음::* td> | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
following-sibling td> | 현재 노드와 같은 아버지와 남동생 노드 | 다음- 형제:: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
이전 | 이전의 모든 노드 Xml 문서의 현재 노드 | 이전:* | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
네임스페이스 | 현재 노드의 모든 네임스페이스 노드 선택 | namespace::* | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
부모 | 현재 노드의 상위 노드 | parent::이중점과 같습니다. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
선행 형제 | 현재 노드 다음의 동일한 아버지 및 형제 노드 | 선행 형제::* | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
현재 노드 | 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(); } } }
以上就是xml学习(6) 在c#Xpath实例的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!