Mendapatkan atribut menggunakan XPath

344

Diberikan struktur XML seperti:

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

Bagaimana saya bisa mendapatkan nilai lang(di mana langadalah engdalam judul buku), untuk elemen pertama?

GurdeepS
sumber
2
tautan yang sangat bagus saat menggunakan xpaths test-able.blogspot.ie/2016/04/xpath-selectors-cheat-sheet.html

Jawaban:

472

Bagaimana saya bisa mendapatkan nilai lang (di mana lang = eng dalam judul buku), untuk elemen pertama?

Gunakan :

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

Ini berarti :

Pilih langatribut elemen judul yang merupakan anak dari bookanak pertama dari elemen atas dokumen XML.

Untuk mendapatkan nilai string atribut ini gunakan fungsi XPath standarstring() :

string(/*/book[1]/title/@lang)
Dimitre Novatchev
sumber
3
@AbhishekAsthana, Hasil mengevaluasi ekspresi XPath menghasilkan nilai string langatribut. Jika atribut tidak mengandung tanda kurung siku, mereka tidak akan menjadi bagian dari hasil evaluasi ekspresi XPath. Dugaan saya adalah ini ditambahkan oleh alat (tidak pantas) yang Anda gunakan.
Dimitre Novatchev
6
ya saya menemukan masalah .. itu hanya bagaimana soapUI menampilkannya tetapi kurung itu tidak digunakan ketika saya menggunakan nilai xpath. Saya sudah sering melihat ini. Masalahnya bukan dengan alat .. itu antara kursi dan keyboard.
Abhishek Asthana
4
@ KorayTugay, ekspresi XPath /*/book[1]/title/@lang memilih kumpulan-simpul dari 0 atau lebih atribut atribut, sedangkan ekspresi XPath string(/*/book[1]/title/@lang)ketika dievaluasi, menghasilkan nilai string dari kumpulan-simpul ini - dan ini adalah nilai string yang pertama (dalam urutan dokumen) simpul dari simpul-set ini.
Dimitre Novatchev
4
@ KorayTugay, Tidak, ekspresi pertama memilih , tidak "kembali" - satu set node, dan set node ini bukan string. Node bukan string - simpul adalah simpul di pohon . Dokumen XML adalah pohon node. lang="eng"hanyalah salah satu dari banyak representasi tekstual dari simpul atribut yang memiliki nama "lang", bukan milik namespace, dan memiliki nilai string string "eng"
Dimitre Novatchev
1
@Vladimir, Jika v sesuai dengan namespace-uri dari say: "my: vvv", maka seseorang dapat membuat di host mesin XPath yang digunakan pemetaan yang mengaitkan myPrefix (mungkin v tetapi tidak perlu) ke namespace yang sama -uri "my: vvv". Dan kemudian atribut akan dipilih menggunakan: title / @ myPrefix: lang. Bagaimana pemetaan semacam itu dibuat khusus untuk implementasi dan kita harus membaca dalam dokumentasi host mesin XPath. Ini dilakukan dengan cara tertentu di .NET dan dengan cara lain di katakanlah di Saxon. Jika Anda tidak memiliki pemetaan seperti itu, gunakan: title / @ * [name () = 'v: lang']
Dimitre Novatchev
47

Terima kasih! Ini memecahkan masalah serupa yang saya miliki dengan atribut data di dalam Div.

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

Gunakan xpath ini: //*[@id="prop_sample"]/@data-want

Semoga ini bisa membantu orang lain!

smulldino
sumber
6

Anda dapat mencoba di bawah pola xPath,

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")
Sharath
sumber
5
Itu akan memilih elemen judul XML apa saja di bawah / toko buku / buku yang memiliki atribut At dengan nilai eng, BUKAN nilai lang. yaitu memilih daftar elemen, bukan Atribut tunggal
JFK
2

Anda juga bisa mendapatkannya dengan

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

Meskipun jika Anda menggunakan XMLDOM dengan JavaScript Anda dapat kode sesuatu seperti

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

dan n1.textakan memberi Anda nilai"eng"

Vinod Srivastav
sumber
2

kamu bisa menggunakan:

(//@lang)[1]

ini berarti Anda mendapatkan semua atribut node dengan nama sama dengan "lang" dan mendapatkan yang pertama.

starcwl
sumber
0

Berikut ini cuplikan dari mendapatkan nilai atribut "lang" dengan XPath dan VTD-XML.

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());
    }
}
vtd-xml-author
sumber
0

Jika Anda menggunakan PostgreSQL, ini adalah cara yang tepat untuk mendapatkannya. Ini hanya asumsi di mana Anda memiliki tabel buku, kolom TITLE dan PRICE dengan data yang terisi. Inilah pertanyaannya

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