XPathを使用して属性を取得する


344

次のような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="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

どのように私はの値が得ることができるlang(ここlangeng最初の要素のために、本のタイトルには)?


回答:


472

最初の要素のlang(本のタイトルではlang = eng)の値を取得するにはどうすればよいですか?

使用

/*/book[1]/title/@lang

これは

XMLドキュメントの最上位要素のlang最初のbook子の子であるタイトル要素の属性を選択します。

この属性の文字列値のみを取得するには、標準のXPath関数を使用しますstring()

string(/*/book[1]/title/@lang)

3
@ AbhishekAsthana、XPath式を評価した結果、lang属性の文字列値が正確に生成されます。属性に角かっこが含まれていない場合、XPath式の評価結果の一部にはなりません。私の推測では、これらは使用している(不適切な)ツールによって追加されたものです。
Dimitre Novatchev 2014年

6
ええ、私は問題を理解しました。それはsoapUIがそれを表示する方法ですが、xpath値を使用する場合、これらのブラケットは使用されません。私はこれをたくさん見ました。問題は、椅子とキーボードの間のツールではありません。
Abhishek Asthana 2014年

4
@ KorayTugay、XPath式は0個以上の属性ノードのノードセットを/*/book[1]/title/@lang 選択し、XPath式string(/*/book[1]/title/@lang)は評価時にこのノードセットの文字列値を生成します-これは最初の(ドキュメント順の)文字列値ですこのノードセットのノード。
Dimitre Novatchev 2014年

4
@KorayTugay、いいえ、最初の式selectは「戻り」ません。ノードのセットであり、このノードのセットは文字列ではありません。ノードは文字列ではありません-ノードはツリー内のノードです。XMLドキュメントはノードのツリーです。lang="eng"「lang」という名前があり、名前空間に属しておらず、文字列「eng」という文字列値を持つ属性ノードの多くのテキスト表現の1つにすぎません
Dimitre Novatchev

1
@ Vladimir、vがたとえば "my:vvv"の名前空間URIに対応する場合、使用されているXPathエンジンのホストで、同じ名前空間にmyPrefix(vの可能性がありますが、必須ではない)を関連付けるマッピングを作成できます。 -uri "my:vvv"。そして、属性は、title / @ myPrefix:langを使用して選択されます。このようなマッピングの作成方法は実装固有であり、XPathエンジンのホストのドキュメントを読む必要があります。これは、.NETでは特定の方法で行われ、Saxonでは別の方法で行われます。そのようなマッピングがない場合は、次を使用します。title/ @ * [name()= 'v:lang']
Dimitre Novatchev

47

ありがとう!これにより、Div内のデータ属性に関する同様の問題が解決しました。

<div id="prop_sample" data-want="data I want">data I do not want</div>

このxpathを使用します。 //*[@id="prop_sample"]/@data-want

これが誰かを助けることを願っています!


6

以下のxPathパターンを試すことができます。

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")

5
これは、langの値ではなく、値engのlang属性を持つ/ bookstore / bookの下のすべてのXML タイトル要素を選択します。つまり、単一の属性ではなく、要素のリストを選択します
JFK

2

あなたはそれを手に入れることもできます

string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)

JavaScriptでXMLDOMを使用している場合は、次のようなコードを記述できます。

var n1 = uXmlDoc.selectSingleNode("//bookstore/book[1]/title/@lang");

そしてn1.textあなたに価値を与えます"eng"


2

あなたは使うことができます:

(//@lang)[1]

つまり、「lang」に等しい名前を持つすべての属性ノードを取得し、最初のノードを取得します。


0

XPathとVTD-XMLを使用して「lang」の属性値を取得するスニペットを次に示します。

import com.ximpleware.*;
public class getAttrVal {
    public static void main(String s[]) throws VTDException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false)){
            return ;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/bookstore/book/title/@lang");
        System.out.println(" lang's value is ===>"+ap.evalXPathToString());
    }
}

0

PostgreSQLを使用している場合は、これが正しい方法です。これは、データが入力されたブックテーブルTITLEおよびPRICE列がある場合の単なる想定です。これがクエリです

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.