Heim > Backend-Entwicklung > XML/RSS-Tutorial > Einführung in die XML-XPATH-Syntax

Einführung in die XML-XPATH-Syntax

黄舟
Freigeben: 2017-02-24 15:19:04
Original
1472 Leute haben es durchsucht


Warum benötigen Sie XPath?

Bei Verwendung von dom4j können wir ein Element nicht schichtübergreifend abrufen, was sehr mühsam ist.
Damit wir bequemer auf einen bestimmten Knoten zugreifen können, können wir die XPath-Technologie verwenden, die es uns ermöglicht, den angegebenen Knoten sehr bequem zu lesen.

xpath wird normalerweise in Verbindung mit dom4j verwendet, und wenn Sie xpath verwenden möchten, müssen Sie ein neues Paket jaxen-1.1-beta-6.jar einführen

Die grundlegende Syntax von xpath weist die folgenden Punkte auf:

1 Die grundlegende xpath-Syntax ähnelt dem Auffinden von Dateien in einem Dateisystem Der Pfad beginnt mit einem Schrägstrich /Start, dann stellt der Pfad den absoluten Pfad zu einem Element dar

(1) /AAA, was die Auswahl des Stammelements AAA darstellt

<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里
Nach dem Login kopieren
Nach dem Login kopieren

(2)/AAA/CCC, was angibt, dass alle CCC-Unterelemente von AAA ausgewählt sind

<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>
Nach dem Login kopieren
Nach dem Login kopieren

(3) /AAA/DDD/BBB, was angibt, dass alle BBB-Unterelemente von AAAs Unterelementen DDD sind ausgewählt sind

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>
Nach dem Login kopieren
Nach dem Login kopieren

Wie verwende ich xpath in dom4j? Es ist eigentlich ganz einfach:

//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");
Nach dem Login kopieren

Nachdem Sie das Dokumentobjekt über dom4j erhalten haben, können Sie die selectNodes(args)-Methode des Dokuments verwenden. Diese Methode gibt einen List entsprechend dem von Ihnen geschriebenen XPath-Pfad zurück Die Operationen sind die gleichen wie bei dom4j.

Gleichzeitig gibt es auch eine selectSingleNode(args)-Methode, die einen einzelnen Knoten zurückgibt.


Im Folgenden wird weiterhin eine andere XPath-Syntax eingeführt:

2. Wenn der Pfad mit einem doppelten Schrägstrich // beginnt, bedeutet dies, dass alle Dateien im Dokument erfüllen den doppelten Schrägstrich //Elemente nachfolgender Regeln (unabhängig von der hierarchischen Beziehung)

(1) //BBB, was bedeutet, dass alle BBB-Elemente ausgewählt werden

<AAA>
    <BBB/>这里    <CCC/>
    <BBB/>这里    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

(2 ) //DDD/BBB, was bedeutet, dass alle Elemente das BBB-Element von DDD sind

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

3. Das Sternchen * bedeutet, dass alle Elemente ausgewählt werden, die sich im Pfad vor dem Sternchen befinden

(1) /AAA/CCC/DDD/*, was bedeutet, dass alle Elemente ausgewählt werden, deren Pfade an /AAA/CCC/DDD angehängt sind:

<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>
Nach dem Login kopieren
Nach dem Login kopieren

(2) /*/*/*/BBB, was bedeutet alle BBBs mit 3 Vorgängerelementen Element

<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>
Nach dem Login kopieren

(3) //*, was bedeutet, dass alle Elemente ausgewählt werden


4. Die Ausdrücke in eckigen Klammern können weitergehen Geben Sie die Elemente an, wobei die Zahl die Position des Elements im Auswahlsatz darstellt und die Funktion last() das letzte Element im Auswahlsatz darstellt. Es ist wichtig zu beachten, dass die Indizes hier bei 1 und nicht bei 0 beginnen!
(1)/AAA/BBB[1], was bedeutet, dass das erste BBB-Unterelement von AAA ausgewählt wird

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

(2) /AAA/BBB[last()], was bedeutet, dass das letzte BBB-Element von AAA ausgewählt wird

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>
Nach dem Login kopieren
Nach dem Login kopieren

5. Operationen an Attributen

(1) //@id, wählen Sie alle ID-Attribute aus, Hinweis: Behandeln Sie alle ID-Attribute als Der Knoten ist wird anstelle des Knotens mit dem id-Attribut zurückgegeben.

<AAA>
    <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>
    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

(2)//BBB[@id], alle BBB-Knoten mit ID-Attribut auswählen

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>
    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

(3)//BBB[@name], alle BBB-Knoten mit Namensattribut auswählen

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

(4)//BBB[@*], alle BBB-Knoten mit Attributen auswählen

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

(5)//BBB[not(@*)], alle BBB-Knoten ohne Attribute auswählen

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>
Nach dem Login kopieren
Nach dem Login kopieren

6. Der Wert des Attributs kann als Auswahlkriterium verwendet werden

(1) //BBB[@id=&#39;b1&#39;], wählen Sie das Attribut aus, das die Attribut-ID enthält und dessen Wert „b1“ ist. BBB-Elemente

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

7. Die Funktion count() kann die Anzahl der ausgewählten Elemente zählen

(1) //*[count(BBB)=2], select enthält 2 Elemente mit untergeordneten BBB-Elementen

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

(2) //*[count(*)=2], Elemente mit 2 untergeordneten Elementen auswählen

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

Es gibt viele andere Syntaxen, darunter viele. Es gibt keine Viele Anwendungen von Funktionen werden hier nicht vorgestellt


Darüber hinaus können die oben eingeführten Syntaxpunkte beliebig kombiniert werden, wie zum Beispiel im folgenden XML-Dokument:

<AAA>
    <BBB id="b1">
        <CCC>
            <KKK>k1</KKK>
        </CCC>
        <CCC>
            <KKK>k2</KKK>这个        </CCC>
    </BBB>
    <BBB id="b2"/>
    <BBB name="bbb"/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

Wenn wir nun das KKK-Unterelement des 2. CCC-Unterelements unterhalb des 1. BBB-Unterelements unterhalb des AAA-Elements finden möchten, sollte der XPath-Pfad so geschrieben werden:
/AAA/BBB[1]/CCC[2]/KKK

Warum wird xpath benötigt?

Bei Verwendung von dom4j können wir ein Element nicht schichtübergreifend abrufen, was sehr mühsam ist.
Damit wir bequemer auf einen bestimmten Knoten zugreifen können, können wir die XPath-Technologie verwenden, die es uns ermöglicht, den angegebenen Knoten sehr bequem zu lesen.

xpath wird normalerweise in Verbindung mit dom4j verwendet, und wenn Sie xpath verwenden möchten, müssen Sie ein neues Paket jaxen-1.1-beta-6.jar einführen

Die grundlegende Syntax von xpath ist wie folgt:

1. Die grundlegende xpath-Syntax ähnelt der Suche nach Dateien in einem Dateisystem beginnt mit einem Schrägstrich /Start, dann stellt der Pfad den absoluten Pfad zu einem Element dar

(1)/AAA, was die Auswahl des Stammelements AAA

<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里
Nach dem Login kopieren
Nach dem Login kopieren
< darstellt 🎜>(2)

, was angibt, dass alle CCC-Unterelemente von AAA ausgewählt sind /AAA/CCC

<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>
Nach dem Login kopieren
Nach dem Login kopieren
(3)

, was angibt, dass alle BBB-Unterelemente von AAAs Unterelementen DDD ausgewählt sind ausgewählt /AAA/DDD/BBB

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>
Nach dem Login kopieren
Nach dem Login kopieren

那么怎么在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");
Nach dem Login kopieren

通过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>
Nach dem Login kopieren
Nach dem Login kopieren

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

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

(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>
Nach dem Login kopieren

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


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

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>
Nach dem Login kopieren
Nach dem Login kopieren

5.对属性的操作

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

<AAA>
    <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>
    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>
    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

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

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

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

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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


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

<AAA>
    <BBB id="b1">
        <CCC>
            <KKK>k1</KKK>
        </CCC>
        <CCC>
            <KKK>k2</KKK>这个        </CCC>
    </BBB>
    <BBB id="b2"/>
    <BBB name="bbb"/></AAA>
Nach dem Login kopieren
Nach dem Login kopieren

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


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


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage