Maison >développement back-end >Tutoriel XML/RSS >Syntaxe XPath : introduction au code spécifique à l'utilisation d'exemples XPath en C#

Syntaxe XPath : introduction au code spécifique à l'utilisation d'exemples XPath en C#

黄舟
黄舟original
2017-03-09 16:55:101784parcourir

XPath peut localiser rapidement des nœuds ou des attributs en XML. La syntaxe XPath est très simple, mais suffisamment puissante. C'est aussi la connaissance de base pour utiliser xslt.

Exemple de syntaxe :


1. Symboles dans XPath

<?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>



Symbole


//chien[/pricea76a8e38a9f5192ace4541cbada28b65

supérieur à

>=

supérieur ou égal à

<

est inférieur à

<=

est inférieur ou égal à

et

et est lié à

ou

ou Relation Ou



4.

Axes XPath Traduit littéralement, c'est la signification de l'axe XPath , mais selon mon Il est plus approprié de comprendre que cela est traduit en mots-clés d'opération de relation de nœud XPath, qui sont un ensemble de mots-clés plus ::double deux-points pour indiquer un ou un groupe de nœuds liés au nœud actuel <.>Utilisez la syntaxe : axisname::nodetest [predicate] Autrement dit, axis name::node name [node condition]

La description spécifique est la suivante :


Description


Exemple


Exemple de description


/


signifie partir du nœud racine pour sélectionner



/pets



Sélectionner le nœud racinepets



représente le séparateur entre le nœud et le nœud enfant



/pets/dog



Sélectionnez le nœud dog sous le nœud pets



//xx



signifie effectuer une recherche dans l'intégralité du document xml, quelle que soit la position actuelle du nœud



//prix



Sélectionner tous les nœuds prix dans le document >

Un seul point demi-largeur anglais indique la sélection du nœud actuel



/pets/.



Sélectionner animauxNoeud



..



Les doubles points indiquent la sélection du nœud parent



/pets/dog[0]/..



représente le nœud pets, qui est le nœud parent du premier nœud dog



@xx



signifie sélectionner des attributs



//dog/@color



signifie Sélectionner l'ensemble d'attributs color de tous les nœuds dog



[…]



Les crochets indiquent les conditions de sélection, et les conditions entre parenthèses sont



//chien[@color='white']



Tous les nœuds chien



ancêtre
Mots clés



Description



Exemple



Exemple de description




Le nœud parent du nœud actuel



ancêtre::pig



pigNode



ancêtre-ou-soi



Le nœud actuel et son nœud parent



ancêtre::cochon




attribut



Tous les attributs du nœud actuel



attribut::weight



est équivalent à @weight, attribut :: et @ sont équivalents



enfant



Tous les points d'octet du nœud actuel



enfant::*[nom()!='prix']



Sélectionnez le nœud enfant dont le nom n'est pas prix



descendant



Nœud descendant



descendant ::*[@*]



Nœuds descendants avec attributs



descendant-ou-soi



Nœuds descendants et nœud actuel



descendant-ou-soi ::*




suivant



XmlTous les nœuds après le nœud actuel dans le document



suivant :::*




frère-sœur suivant



Le même nœud père et frère cadet du nœud actuel



frère-soeur suivant ::




précédent



XmlTous les nœuds avant le nœud actuel dans le document



précédent::*




espace de noms



Sélectionner tous les nœuds d'espace de noms du nœud actuel



espace de noms ::*




parent



Le nœud parent du nœud actuel



parent : :



équivaut à un double point..



frère-précédent



Le même nœud père et frère après le nœud actuel



frère-précédent::*




soi



Nœud actuel



soi ::*



équivaut à un seul point .






5. 常用的XPath函数介绍:

在XPath表达式中常用的函数有下面两个:

position() 表示节点的序号例如 //cat[position() = 2] 表示取序号为2的dog节点
last() 表示取最后一个节点 //cat[last()] 
name() 表示当前节点名字 /pets/*[name() != &#39;pig&#39;] 表示/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() != &#39;pig&#39;]");
               

                //选择价格大于100而不是pig的动物
                XmlNodeList priceGreaterThan100s = doc.SelectNodes("/pets/*[price p @weight >10 and name() != &#39;pig&#39;]");
                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();
        }
    }
}



Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn