ホームページ  >  記事  >  バックエンド開発  >  XML - XPATH 構文の概要

XML - XPATH 構文の概要

黄舟
黄舟オリジナル
2017-02-24 15:19:041431ブラウズ


なぜ xpath が必要なのですか?

dom4j を使用すると、レイヤーをまたがって特定の要素を取得することができず、レイヤーごとに取得する必要があり、非常に面倒です。
したがって、特定のノードにもっと便利にアクセスするために、指定されたノードを非常に便利に読み取ることができる xpath テクノロジーを使用できます。

xpath は通常、dom4j と組み合わせて使用​​されますそして、xpath を使用したい場合は、新しいパッケージ jaxen-1.1-beta-6.jar を導入する必要があります

xpath の基本的な構文は次のとおりです。以下の点:

1. 基本的な xpath 構文は、ファイル システム内のファイルの検索に似ています。パスがスラッシュ / で始まる場合、そのパスは要素への絶対パスを表します。 /开始,那么该路径就表示到一个元素的绝对路径.

(1)/AAA,它表示选择根元素AAA

<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里

(2)/AAA/CCC,表示选择AAA的所有CCC子元素

<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>

(3)/AAA/DDD/BBB,表示选择AAA的子元素DDD的所有BBB子元素

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>

那么怎么在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");

通过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>

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

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>

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>

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

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


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

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>

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

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>

5.对属性的操作

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

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

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

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

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

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

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

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

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

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>

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

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

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>

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

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

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>

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

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>

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


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

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

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

为什么需要xpath?

在使用dom4j的时候,我们不能跨层获取某一个元素,必须一层一层去获取,这就非常麻烦。
所以为了我们更方便地访问某个节点,我们可以使用xpath技术,它可以让我们非常方便地读取到指定节点。

xpath通常结合dom4j配合使用,而且如果要使用xpath,则需要引入一个新的包jaxen-1.1-beta-6.jar

xpath的基础语法有以下几点:

1.基本的xpath语法类似于在一个文件系统中定位文件,如果路径以斜线/开始,那么该路径就表示到一个元素的绝对路径.

(1)/AAA,它表示选择根元素AAA

<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里

(2)/AAA/CCC,表示选择AAA的所有CCC子元素

<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>

(3)/AAA/DDD/BBB

(1) /AAA、ルート要素 AAA🎜
<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>
を選択することを意味します🎜 (2) /AAA/CCC、つまり AAA のすべての CCC サブ要素を選択することを意味します🎜
//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");
🎜 (3) /AAA/DDD/BBB は、AAA のサブ要素である DDD のすべての BBB サブ要素が選択されていることを示します🎜
<AAA>
    <BBB/>这里    <CCC/>
    <BBB/>这里    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
🎜 では、dom4j で xpath を使用するにはどうすればよいでしょうか?実際は非常に簡単です: 🎜
<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>
🎜 dom4j を通じてドキュメント オブジェクトを取得した後、ドキュメントの selectNodes(args) メソッドを使用できます。このメソッドは、に基づいて List を返します。 xpath パスを記述した場合、残りの操作は dom4j と同様です。 🎜🎜同時に、単一のノードを返すために使用される selectSingleNode(args) メソッドもあります。 🎜
🎜以下では引き続き他の xpath 構文を紹介します: 🎜🎜🎜2. パスが二重スラッシュ // で始まる場合、ドキュメント内のすべてのファイルが double の条件を満たすことを意味します。スラッシュ // ルール要素 (階層関係に関係なく) の後🎜🎜🎜(1)//BBB は、すべての 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>
🎜(2)//DDD/BBB は、すべての親要素が 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>

🎜🎜3 の BBB 要素であることを示します。アスタリスク * は、すべての要素がパスによって配置されていることを示します。アスタリスクが選択される前🎜🎜🎜( 1) /AAA/CCC/DDD/*。これは、パスが /AAA/CCC/DDD にアタッチされているすべての要素を選択することを意味します: 🎜
<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>
🎜 (2) /*/*/*/ BBB、3 つの祖先要素を持つすべての BBB 要素を表します🎜
<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>
🎜(3) //*、すべての要素の選択を表します🎜
🎜🎜4. 角括弧内の式で要素をさらに指定できます。ここで、数字は選択セット内の要素の位置を表し、last() 関数は選択セット内の最後の要素を表します。ここでの添字は 0 ではなく 1 から始まることに注意することが重要です。 🎜 🎜(1)/AAA/BBB[1]、AAA🎜
<AAA>
    <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>
    <BBB/></AAA>
🎜(2)/AAA/BBB[last()] は、AAA🎜<pre class="brush:xml;toolbar:false;">&lt;AAA&gt; &lt;BBB id=&quot;b1&quot;/&gt;返回这个BBB节点 &lt;BBB id=&quot;b2&quot;/&gt;也返回这个BBB节点 &lt;BBB name=&quot;bbb&quot;/&gt; &lt;BBB/&gt;&lt;/AAA&gt;</pre><hr>🎜🎜 の最後の BBB 要素を選択することを意味します。 5. 属性に対する操作🎜🎜🎜 (1) <code>//@id、すべての ID 属性を選択します。 注:すべての id 属性は、id 属性を持つノードではなく、ノードとして返されます。 🎜
<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
🎜(2)//BBB[@id]、id 属性を持つすべての BBB ノードを選択します🎜
<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>
🎜(3)//BBB[@name]、選択名前属性🎜
<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>
🎜(4)//BBB[@*] を持つすべての BBB ノード、属性🎜
<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>
🎜(5)//BBB[not ( @*)]、属性のないすべての BBB ノードを選択します🎜
<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>

🎜🎜6. 属性の値は選択基準として使用できます🎜🎜🎜(1)//BBB [ @id='b1'] で、属性 ID を含む BBB 要素を選択し、その値は 'b1'🎜
<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>

🎜🎜7 count() 関数です。選択した要素の数を数えることができます🎜🎜🎜(1)//*[count(BBB)=2]、2つのBBBサブ要素を含む要素を選択します🎜
<AAA>
    <BBB id="b1">
        <CCC>
            <KKK>k1</KKK>
        </CCC>
        <CCC>
            <KKK>k2</KKK>这个        </CCC>
    </BBB>
    <BBB id="b2"/>
    <BBB name="bbb"/></AAA>
🎜(2) / /*[count(*)=2]、2 つのサブ要素を含む要素を選択します🎜rrreee🎜🎜多くの関数の適用を含む、他にも多くの構文がありますが、それらはあまり使用されず、今後も使用されませんここで紹介します🎜🎜
🎜 さらに、上記で紹介した構文ポイントは、次の XML ドキュメントのように任意の方法で組み合わせることができます: 🎜rrreee🎜 ここで、以下の 2 番目の CCC サブ要素の KKK を見つけたいとします。最初の BBB サブ要素の子要素の下にある AAA 要素の場合、xpath パスは次のように記述する必要があります: 🎜/AAA/BBB[1]/CCC[2]/KKK🎜🎜なぜ必要なのでしょうかxpath?🎜🎜dom4jを使用する場合、レイヤーをまたぐことができません ある要素を取得するには、レイヤーごとに取得する必要があり、非常に面倒です。 🎜したがって、特定のノードにもっと便利にアクセスするために、指定されたノードを非常に便利に読み取ることができる xpath テクノロジーを使用できます。 🎜🎜🎜🎜xpath は通常、dom4j と組み合わせて使用​​されます🎜そして、xpath を使用したい場合は、新しいパッケージ jaxen-1.1-beta-6.jar を導入する必要があります🎜🎜🎜🎜🎜 xpath の基本的な構文は次のとおりです。以下の点: 🎜🎜 🎜1. 基本的な xpath 構文は、ファイル システム内のファイルの検索に似ています。パスがスラッシュ / で始まる場合、そのパスは要素への絶対パスを表します。 🎜🎜 (1) /AAA、ルート要素 AAA🎜rrreee を選択することを意味します🎜 (2) /AAA/CCC、つまり AAA のすべての CCC サブ要素を選択することを意味します🎜rrreee🎜 (3) /AAA/DDD/BBB は、AAA のサブ要素である DDD のすべての BBB サブ要素が選択されていることを示します🎜
<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>

那么怎么在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");

通过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>

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

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>

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>

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

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


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

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>

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

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>

5.对属性的操作

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

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

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

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

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

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

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

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

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

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>

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

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

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>

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

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

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>

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

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>

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


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

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

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


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


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。