zoukankan      html  css  js  c++  java
  • XPath积累

    测试使用两个xml文件。 

    文件1.XML内容如下:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <bookstore>
    <book>
      <title lang="eng">Harry Potter</title>
      <price>29.99</price>
      <book>
        <title lang="eng">Harry Potter</title>
        <price>29.99</price>
      </book>
    </book>
    <book>
      <title lang="abcdef">Learning XML</title>
      <price>39.95</price>
    </book>
    </bookstore>

    文件2.XML内容如下:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <bookstore>
    <book>
      <title lang="eng">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
      <title lang="abcdef">Learning XML</title>
      <price>39.95</price>  
      <title>999</title>
    </book>
    </bookstore>

    C#操作代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Xml;
      6 namespace XPath学习
      7 {
      8     class Program
      9     {
     10         static void Main(string[] args)
     11         {
     12             Fun1();
     13             //Fun2();
     14         }
     15         /// <summary>
     16         /// XPath选取节点
     17         /// </summary>
     18         static void Fun1()
     19         {
     20             XmlDocument xml = new XmlDocument();
     21             xml.Load(@"1.xml");
     22             //返回“bookstore”,选取根元素 bookstore 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!   
     23             Console.WriteLine(xml.SelectSingleNode("/bookstore").Name);
     24             //返回2,选取所有属于 bookstore 的子元素的 book 元素   
     25             Console.WriteLine(xml.SelectNodes("bookstore/book").Count);
     26             //返回1,选取所有属于 bookstore 的子元素 book 的子元素的 book 元素   
     27             Console.WriteLine(xml.SelectNodes("bookstore/book/book").Count);
     28             //返回3,选取所有 book 子元素,而不管它们在文档中的位置 
     29             Console.WriteLine(xml.SelectNodes("//book").Count);
     30             //返回3,选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置
     31             Console.WriteLine(xml.SelectNodes("bookstore//book").Count);
     32 
     33             //下面两个例子说明SelectNodes方法参数中不带“/”搜索的是使用该方法的元素的子元素而非后代元素
     34             //返回1
     35             Console.WriteLine(xml.GetElementsByTagName("book")[0].SelectNodes("book").Count);
     36             //返回0
     37             Console.WriteLine(xml.SelectNodes("book").Count);
     38             //“..”是选取当前节点的父节点,返回bookstore
     39             Console.WriteLine(xml.GetElementsByTagName("book")[0].SelectSingleNode("..").Name);
     40             //“.”是选取当前节点,返回第一个book元素的子元素数量,即3
     41             Console.WriteLine(xml.GetElementsByTagName("book")[0].SelectSingleNode(".").ChildNodes.Count);
     42             //返回3,选取所有名为 lang 的属性。
     43             XmlNodeList attrs = xml.SelectNodes("//@lang");
     44             Console.WriteLine(attrs.Count+"\tnodetype:"+attrs[0].NodeType);
     45             //返回2,选取bookstore/book/title的lang属性(不包括bookstore/book/book/title)
     46             Console.WriteLine(xml.SelectNodes("bookstore/book/title/@lang").Count);
     47             //“*”匹配任何节点,下面是选取所有节点,返回10
     48             Console.WriteLine(xml.SelectNodes("//*").Count);
     49             //选取bookstore,返回“bookstore”
     50             Console.WriteLine(xml.SelectNodes("*")[0].Name);//或者是"/*"
     51             //选取#document(最顶层节点),返回“#document”
     52             Console.WriteLine(xml.SelectNodes(".")[0].Name);
     53             //返回2,选取bookstore的两个子节点
     54             Console.WriteLine(xml.SelectNodes("./bookstore/*").Count);//或者是“bookstore/*”
     55 
     56             //返回1,选取bookstore/book/book/title的所有属性节点,“@*”匹配所有属性节点
     57             Console.WriteLine(xml.SelectNodes("bookstore/book/book/title/@*").Count);
     58             //返回4,选取bookstore/book/book所有后代节点,包括文本节点,不包括属性节点,“node()”匹配除了属性节点以外的任何类型节点
     59             XmlNodeList allNode=xml.SelectNodes("bookstore/book/book//node()");
     60             Console.WriteLine(allNode.Count);
     61             foreach (XmlNode x in allNode)
     62             {
     63                 Console.Write("nodename:{0}\t",x.Name);
     64             }
     65             Console.WriteLine();
     66         }
     67         /// <summary>
     68         /// XPath谓语
     69         /// </summary>
     70         static void Fun2()
     71         {
     72             XmlDocument xml = new XmlDocument();
     73             xml.Load(@"2.xml");
     74             //返回“1   eng”,/bookstore/book[1]是选取属于 bookstore 子元素的第一个 book 元素
     75             Console.WriteLine(xml.SelectNodes("bookstore/book[1]").Count + "\t" + xml.SelectNodes("bookstore/book[1]")[0].ChildNodes[0].Attributes["lang"].Value);
     76             //返回“1   abcdef”,/bookstore/book[last()]是选取属于  bookstore 子元素的最后一个 book 元素
     77             Console.WriteLine(xml.SelectNodes("bookstore/book[last()]").Count + "\t" + xml.SelectNodes("bookstore/book[last()]")[0].ChildNodes[0].Attributes["lang"].Value);
     78             //返回“1   abcdef”,/bookstore/book[last()-1]是选取属于   bookstore 子元素的倒数第二个 book 元素
     79             Console.WriteLine(xml.SelectNodes("bookstore/book[last()-1]").Count + "\t" + xml.SelectNodes("bookstore/book[last()-1]")[0].ChildNodes[0].Attributes["lang"].Value);
     80 
     81             //返回2,bookstore/book[position()<3]是选取最前面的两个属于 bookstore 元素的子元素的 book 元素
     82             Console.WriteLine(xml.SelectNodes("bookstore/book[position()<3]").Count);
     83             //返回2,//title[@lang]是选取选取所有拥有名为 lang 的属性的 title 元素
     84             Console.WriteLine(xml.SelectNodes("//title[@lang]").Count);
     85             //返回1,//title[@lang='abcdef']是选取所有 title 元素,且这些元素拥有值为 abcdef 的 lang 属性
     86             Console.WriteLine(xml.SelectNodes("//title[@lang='abcdef']").Count);
     87 
     88             //返回1,/bookstore/book[price>35.00]是选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00
     89             Console.WriteLine(xml.SelectNodes("/bookstore/book[price>35.00]").Count);
     90 
     91             //返回2,/bookstore/book[price>35.00]是选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00
     92             Console.WriteLine(xml.SelectNodes("/bookstore/book[price>35.00]/title").Count);
     93  
     94  
     95             //返回5,“//book/title | //book/price”选取所有 book 元素的 title 和 price 元素
     96             Console.WriteLine(xml.SelectNodes("//book/title | //book/price").Count);
     97             //返回5,“//title | //price”选取所有 title 和 price 元素
     98             Console.WriteLine(xml.SelectNodes("//title | //price").Count);
     99             //返回5,“/bookstore/book/title | //price”选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素
    100             Console.WriteLine(xml.SelectNodes("/bookstore/book/title | //price").Count);
    101              //总结
    102             /*
    103              相对路径:相对路径不起始于正斜杠(/),参数路径表示相对于当前使用SelectNodes或者SelectSingleNode方法的元素的路径,例 如:node1.SelectNodes("aa")表示查询node1的所有aa子元素,如果是使用 XmlDocument.SelectNodes("xxx")表示的是查询#document下的所有xxx节点(其实xxx必须是根节点才查询得 到),而xml.SelectNodes(".")[0].Name为#dopcument
    104              绝对路径:绝对路径起始于正斜杠( / ),参数路径表示从xml文档的#document开始的路径(而非从xml文档根元素开始),所以绝对路径必须以“/根元素”开始才能找到节点,例如 xml.SelectNodes("/bookstore")[0].Name)其实就是xml.SelectNodes("./bookstore") [0].Name)(都表示#document/bookstore)
    105             在XPath中属性节点属于拥有其的元素节点的子节点,例 如:Console.WriteLine(xml.SelectNodes("//title") [0].SelectNodes("@lang").Count),表示查询xml文档中一个title节点的lang属性节点
    106              */     
    107         }
    108     }
    109 }

  • 相关阅读:
    nes 红白机模拟器 第4篇 linux 手柄驱动支持
    nes 红白机模拟器 第3篇 游戏手柄测试 51 STM32
    nes 红白机模拟器 第2篇 InfoNES
    python语言输入
    python控制窗口口字形运动
    python控制窗口对角线运动
    python控制窗口移动(画圆)
    python控制窗口缩放
    python控制窗口显示隐藏
    python修改内存,(修改植物大战僵尸)
  • 原文地址:https://www.cnblogs.com/mxw09/p/1909506.html
Copyright © 2011-2022 走看看