web-dev-qa-db-ja.com

XPathを使って属性を取得する

そのような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です)を取得する方法を教えてください。

308
GurdeepS

最初の要素のlangの値(書籍のタイトルではlang = eng)を取得する方法を教えてください。

つかいます

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

これの意味は

XML文書の最上位要素の最初のlang子の子であるtitle要素のbook属性を選択します。

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

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

ありがとうございます。これは私がDiv内のデータ属性に関して抱えていた同様の問題を解決しました。

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

このxpathを使用してください://*[@id="prop_sample"]/@data-want

これが他の誰かに役立つことを願っています!

36
smulldino

あなたは以下のxPathパターンを試すことができます、

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

またそれによって得ることができます

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"という値を与えるでしょう

1
Vinod Srivastav

PostgreSQLを使用している場合は、これを取得するのが正しい方法です。これは、あなたが book table _ title _ _ price _ にデータが入っているという仮定に過ぎません。これがクエリです

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
0
Royce

あなたが使用することができます:

(//@lang)[1]

これは、 "lang"に等しい名前を持つすべての属性ノードを取得し、最初のものを取得することを意味します。

0
starcwl

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
vtd-xml-author