xml学习(6) 在c#Xpath实例
来源:互联网 发布:34周b超数据判断男女 编辑:程序博客网 时间:2024/05/17 22:16
转载:http://www.cnblogs.com/Miko2012/archive/2012/10/26/2740840.html
在c#中,我们经常查找,遍历节点,这是我们可以用到XPath语法,XPath语法很简单,但是强大够用,XPath可以快速定位到Xml中的节点或者属性,它也是使用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的语法:
1. XPath中的符号
符号
说明
示例
示例说明
/
表示从根节点开始选择
/pets
选择根节点pets
表示节点和子节点之间的间隔符
/pets/dog
选择pets节点下的dog节点
//xx
表示从整个xml文档中查找,而不考虑当前节点位置
//price
选择文档中所有的price节点
.
单个英文半角句点表示选择当前节点
/pets/.
选择pets节点
..
双点,表示选择父节点
/pets/dog[0]/..
表示pets节点,也就是第一个dog节点的父节点
@xx
表示选择属性
//dog/@color
表示选择所有dog节点的color属性集合
[…]
中括号表示选择条件,括号内为条件
//dog[@color=’white’]
所有color为white的dog节点
//dog[/price<100]
所有price字节点值小于100的dog节点
中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的
//dog[1]
第1个dog节点
//dog[last()]
最后一个dog节点,last()是xPath内置函数
|
单竖杠表示合并节点结合
//dog[@color=’white’] | //cat[@color=’white’]
color属性为white的dog节点和color属性为white的cat节点
*
星号表示任何名字的节点或者属性
//dog/*
表示dog节点的所有子节点
//dog/@*
表示dog节点的所有属性节点
关键字
说明
示例
示例说明
ancestor
当前节点的父祖节点
ancestor::pig
当前节点的祖先节点中的pig节点
ancestor-or-self
当前节点以及其父祖节点
ancestor::pig
attribute
当前节点的所有属性
attribute::weight
相当于@weight,attribute::和@是等价的
child
当前节点的所有字节点
child::*[name()!=’price’]
选择名字不是price的子节点
descendant
子孙节点
descendant::*[@*]
有属性的子孙节点
descendant-or-self
子孙节点以及当前节点
descendant-or-self::*
following
Xml文档中当前节点之后的所有节点
following::*
following-sibling
当前节点的同父弟弟节点
following-sibling::
preceding
Xml文档中当前节点之前的所有节点
preceding::*
namespace
选取当前节点的所有命名空间节点
namespace::*
parent
当前节点的父节点
parent::
相当于双点..
preceding-sibling
当前节点之后的同父兄节点
preceding-sibling::*
self
当前节点
self::*
相当于单点.
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 div @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"); //取文档的所有子孙节点priceXmlNodeList childrenNodes = doc.SelectNodes("descendant::price");} Console.Read();}}}
- xml学习(6) 在c#Xpath实例
- XML学习---Xpath学习
- 疯狂XML学习笔记(12)------------XPath
- [XML]学习笔记(七)XPath&XQuery
- 学习xml-XPath
- XML学习笔记---Xpath
- XPath在xml中的应用
- XML基础(XPATH)
- XML学习笔记 4. xpath
- XPath在QT中的使用(QXmlQuery读取XML文件)
- Marklogic学习 由浅入深(3)—— XML、XPath、XQuery
- 使用 System.Xml.XmlDocument 类可在 Visual C#.net 中执行 XPath 查询
- XML文件操作:[学习xpath]XPath最通俗的教程
- XPath在asp.net中查询XML
- XML轻松学习手册(6)XML实例解析
- XML轻松学习手册(6)XML实例解析
- jdom学习(5)在jdom中使用XPath(转)
- xpath学习(一)
- Can't find bundle for base name Message, locale zh_CN
- Ubuntu 下搭建 Android 开发环境(图文)
- VS2010中QtService开发环境搭建
- Struts+Spring+Hibernate练习(完整)
- Python閉包與多線程
- xml学习(6) 在c#Xpath实例
- RMI与RPC的区别
- 众筹模式兴起 互联网金融第三波热潮
- LeetCode 之 Median of Two Sorted Arrays
- VC程序的安装与部署安装项目版-一个简单例子
- 如何配置eth0
- Js中 关于top、clientTop、scrollTop、offsetTop的用法
- 谷歌C++编程风格指南
- 升级到Visual C++ 2010的三纪律八注意