XML : introduction à la syntaxe XPATH

黄舟
Libérer: 2017-02-24 15:19:04
original
1425 Les gens l'ont consulté


Pourquoi avez-vous besoin de XPath ?

Lors de l'utilisation de dom4j, nous ne pouvons pas obtenir un élément sur plusieurs couches, nous devons l'obtenir couche par couche, ce qui est très gênant.
Ainsi, pour que nous puissions accéder plus facilement à un certain nœud, nous pouvons utiliser la technologie XPath, qui nous permet de lire très facilement le nœud spécifié.

xpath est généralement utilisé en conjonction avec dom4j, et si vous souhaitez utiliser XPath, vous devez introduire un nouveau package jaxen-1.1-beta-6.jar

La syntaxe de base de XPath est la suivante :

1 La syntaxe de base de XPath est similaire à la localisation de fichiers dans un système de fichiers. commence par une barre oblique /Start, puis le chemin représente le chemin absolu vers un élément

(1) /AAA, qui représente la sélection de l'élément racine AAA

<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里
Copier après la connexion
Copier après la connexion
<. 🎜>(2)

, indiquant que tous les sous-éléments CCC de AAA sont sélectionnés /AAA/CCC

<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>
Copier après la connexion
Copier après la connexion
(3)

, indiquant que tous les sous-éléments BBB des sous-éléments AAA DDD sont sélectionné /AAA/DDD/BBB

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>
Copier après la connexion
Copier après la connexion
Et alors ? Comment utiliser XPath dans dom4j ? C'est en fait très simple :

//1.得到SAXReader解析器SAXReader saxReader = new SAXReader();
//2.指定去解析哪个文件Document document = saxReader.read(new File(path));
//3.可以使用xpath随心读取// document.selectNodes(args)返回多个元素
// document.selectSingleNode(args)返回单个元素List nodes = document.selectNodes("/AAA/BBB");
Copier après la connexion
Après avoir obtenu l'objet document via dom4j, vous pouvez utiliser la méthode

du document. Cette méthode renverra un selectNodes(args) selon le chemin XPath que vous avez écrit. les opérations sont les mêmes que celles de dom4j Similaire. List

En même temps, il dispose également d'une méthode

qui renvoie un seul nœud. selectSingleNode(args)


Ce qui suit continue d'introduire une autre syntaxe XPath :

2 Si le chemin commence par une double barre oblique , cela signifie que tous les fichiers du document. satisfaire la double barre oblique //Éléments des règles suivantes (quelle que soit la relation hiérarchique) //

(1)

, ce qui signifie sélectionner tous les éléments BBB //BBB

<AAA>
    <BBB/>这里    <CCC/>
    <BBB/>这里    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
Copier après la connexion
Copier après la connexion
(2 )

, ce qui signifie tous L'élément parent est l'élément BBB de DDD //DDD/BBB

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
Copier après la connexion
Copier après la connexion

3 L'astérisque signifie sélectionner tous les éléments situés par le chemin avant l'astérisque. *

(1)

, ce qui signifie sélectionner tous les éléments dont les chemins sont attachés à /AAA/CCC/DDD : /AAA/CCC/DDD/*

<AAA>
    <XXX>
        <DDD>
            <BBB/>
            <BBB/>
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>这里            
            <FFF/>这里        
            </DDD>
    </CCC>
    <CCC>
        <BBB>
            <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>
Copier après la connexion
Copier après la connexion
(2)

, qui signifie tous les BBB avec 3 éléments ancêtres Élément /*/*/*/BBB

<AAA>
    <XXX>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </CCC>
    <CCC>
        <BBB>这里            <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>
Copier après la connexion
(3)

, ce qui signifie sélectionner tous les éléments //*


4 Les expressions entre crochets peuvent en outre être utilisées. spécifiez les éléments, où le nombre représente la position de l'élément dans le jeu de sélection et la fonction last() représente le dernier élément du jeu de sélection. Il est important de noter que les indices ici commencent à 1 et non à 0 ! (1)
, ce qui signifie sélectionner le premier sous-élément BBB de AAA /AAA/BBB[1]

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>
Copier après la connexion
Copier après la connexion
(2)

, ce qui signifie sélectionner le dernier élément BBB de AAA /AAA/BBB[last()]

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>
Copier après la connexion
Copier après la connexion

5. Opérations sur les attributs

(1)

, sélectionnez tous les attributs d'identifiant, remarque : traitez tous les attributs d'identifiant comme Le nœud est renvoyé à la place du nœud avec l'attribut id. //@id

<AAA>
    <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>
    <BBB/></AAA>
Copier après la connexion
Copier après la connexion
(2)

, sélectionnez tous les nœuds BBB avec l'attribut id//BBB[@id]

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>
    <BBB/></AAA>
Copier après la connexion
Copier après la connexion
(3)

, sélectionnez tous les nœuds BBB avec l'attribut name//BBB[@name]

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Copier après la connexion
Copier après la connexion
(4)

, sélectionnez tous les nœuds BBB avec des attributs //BBB[@*]

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Copier après la connexion
Copier après la connexion
(5)

, sélectionnez tous les nœuds BBB sans attributs //BBB[not(@*)]

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>
Copier après la connexion
Copier après la connexion

6. La valeur de l'attribut peut être utilisée comme critère de sélection

(1)

, sélectionnez l'attribut qui contient l'identifiant de l'attribut et sa valeur est 'b1'. Éléments BBB //BBB[@id=&#39;b1&#39;]

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>
Copier après la connexion
Copier après la connexion

7. La fonction peut compter le nombre d'éléments sélectionnés count()

(1)

, select en contient 2. Éléments avec des éléments enfants BBB //*[count(BBB)=2]

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>
Copier après la connexion
Copier après la connexion
(2)

, sélectionnez des éléments avec 2 éléments enfants //*[count(*)=2]

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>
Copier après la connexion
Copier après la connexion
Il existe de nombreuses autres syntaxes, dont beaucoup Il n'y en a pas de nombreuses applications de fonctions et elles ne seront pas présentées ici.


De plus, les points de syntaxe introduits ci-dessus peuvent être combinés de n'importe quelle manière, comme dans le document XML suivant :

<AAA>
    <BBB id="b1">
        <CCC>
            <KKK>k1</KKK>
        </CCC>
        <CCC>
            <KKK>k2</KKK>这个        </CCC>
    </BBB>
    <BBB id="b2"/>
    <BBB name="bbb"/></AAA>
Copier après la connexion
Copier après la connexion
Si l'on veut maintenant trouver le sous-élément KKK du 2ème sous-élément CCC en dessous du 1er sous-élément BBB en dessous de l'élément AAA, le chemin xpath doit s'écrire comme ceci :


/AAA/BBB[1]/CCC[2]/KKK

Pourquoi est-ce nécessaire ? XPath ?

Lors de l'utilisation de dom4j, nous ne pouvons pas obtenir un élément sur plusieurs couches, nous devons l'obtenir couche par couche, ce qui est très gênant.

Ainsi, pour que nous puissions accéder plus facilement à un certain nœud, nous pouvons utiliser la technologie XPath, qui nous permet de lire très facilement le nœud spécifié.

xpath est généralement utilisé en conjonction avec dom4j, et si vous souhaitez utiliser XPath, vous devez introduire un nouveau package jaxen-1.1-beta-6.jar

La syntaxe de base de XPath est la suivante :

1 La syntaxe de base de XPath est similaire à la localisation de fichiers dans un système de fichiers. commence par une barre oblique Start, puis le chemin représente le chemin absolu vers un élément /

(1)

, qui représente la sélection de l'élément racine AAA/AAA

<. 🎜>(2)
<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里
Copier après la connexion
Copier après la connexion
, indiquant que tous les sous-éléments CCC de AAA sont sélectionnés

/AAA/CCC

(3)
<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>
Copier après la connexion
Copier après la connexion
, indiquant que tous les sous-éléments BBB des sous-éléments AAA DDD sont sélectionné

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>
Copier après la connexion
Copier après la connexion

那么怎么在dom4j中运用xpath呢?其实很简单:

//1.得到SAXReader解析器SAXReader saxReader = new SAXReader();
//2.指定去解析哪个文件Document document = saxReader.read(new File(path));
//3.可以使用xpath随心读取
// document.selectNodes(args)返回多个元素
// document.selectSingleNode(args)返回单个元素List nodes = document.selectNodes("/AAA/BBB");
Copier après la connexion

通过dom4j得到document对象后,可以使用document的selectNodes(args)方法,这个方法会根据你写的xpath路径返回一个List,余下的操作就和dom4j类似了。

同时它也有一个selectSingleNode(args)方法,用于返回一个单个的Node。


下面继续介绍其他的xpath语法:

2.如果路径以双斜线//开头,则表示文档中所有满足双斜线//之后规则的元素(无论层级关系)

(1)//BBB,它表示选择所有BBB元素

<AAA>
    <BBB/>这里    <CCC/>
    <BBB/>这里    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
Copier après la connexion
Copier après la connexion

(2)//DDD/BBB,表示所有父元素是DDD的BBB元素

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
Copier après la connexion
Copier après la connexion

3.星号*表示选择所有由星号之前路径所定位的元素

(1)/AAA/CCC/DDD/*,它表示选择所有路径依附于/AAA/CCC/DDD的元素:

<AAA>
    <XXX>
        <DDD>
            <BBB/>
            <BBB/>
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>这里            
            <FFF/>这里        
            </DDD>
    </CCC>
    <CCC>
        <BBB>
            <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>
Copier après la connexion
Copier après la connexion

(2)/*/*/*/BBB,它表示所有的有3个祖先元素的BBB元素

<AAA>
    <XXX>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </CCC>
    <CCC>
        <BBB>这里            
        <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>
Copier après la connexion

(3)//*,它表示选择所有的元素


4.方括号里的表达式可以进一步地指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。特别要注意的是这里的下标是从1开始的,而不是0!
(1)/AAA/BBB[1],它表示选择AAA的第一个BBB子元素

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>
Copier après la connexion
Copier après la connexion

(2)/AAA/BBB[last()],表示选择AAA的最后一个BBB元素

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>
Copier après la connexion
Copier après la connexion

5.对属性的操作

(1)//@id,选择所有的id属性,注意:是把所有的id属性当做节点返回,而不是返回有id属性的节点。

<AAA>
    <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>
    <BBB/></AAA>
Copier après la connexion
Copier après la connexion

(2)//BBB[@id],选择所有有id属性的BBB节点

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>
    <BBB/></AAA>
Copier après la connexion
Copier après la connexion

(3)//BBB[@name],选择所有有name属性的BBB节点

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Copier après la connexion
Copier après la connexion

(4)//BBB[@*],选择所有有属性的BBB节点

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Copier après la connexion
Copier après la connexion

(5)//BBB[not(@*)],选择所有没有属性的BBB节点

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>
Copier après la connexion
Copier après la connexion

6.属性的值可以被用来作为选择的准则

(1)//BBB[@id=&#39;b1&#39;],选择含有属性id且其值为’b1’的BBB元素

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>
Copier après la connexion
Copier après la connexion

7.count()函数可以计数所选元素的个数

(1)//*[count(BBB)=2],选择含有2个BBB子元素的元素

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>
Copier après la connexion
Copier après la connexion

(2)//*[count(*)=2],选择含有2个子元素的元素

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>
Copier après la connexion
Copier après la connexion

还有很多其他的语法,包括很多函数的应用,用的不多,这里不做介绍


另外,上述介绍的几点语法可以任意组合,比如下述的xml文档:

<AAA>
    <BBB id="b1">
        <CCC>
            <KKK>k1</KKK>
        </CCC>
        <CCC>
            <KKK>k2</KKK>这个        </CCC>
    </BBB>
    <BBB id="b2"/>
    <BBB name="bbb"/></AAA>
Copier après la connexion
Copier après la connexion

假如我们现在要找AAA元素下面的第1个BBB子元素下面的第2CCC子元素的KKK子元素,则xpath路径应该这么写:
/AAA/BBB[1]/CCC[2]/KKK


 以上就是XML——XPATH语法介绍 的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!