XPath kullanarak öznitelik alma


344

Böyle bir XML yapısı verildiğinde:

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

Nasıl değerini alabilir lang( langolan engilk elemanı için kitap başlığında),?


Yanıtlar:


473

İlk öğe için lang değerini (kitap başlığında lang = eng) nasıl alabilirim?

Kullanım :

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

Bu şu anlama gelir :

XML belgesinin üst öğesinin langilk bookalt öğesinin alt öğesi olan başlık öğesinin niteliğini seçin .

Bu özniteliğin yalnızca dize değerini almak için standart XPath işlevini kullanınstring() :

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

3
@AbhishekAsthana, XPath ifadesini değerlendirmenin sonucu, tam olarak langözniteliğin dize değerini üretir . Özellik herhangi bir köşeli parantez içermiyorsa, XPath ifadesinin değerlendirmesinin sonucunun bir parçası olmazlar. Tahminimce bunlar kullandığınız bir (uygunsuz) araç tarafından eklenir.
Dimitre Novatchev

6
evet ben sorunu anladım .. bu sadece soapUI görüntüler ama xpath değerini kullandığınızda bu parantez kullanılmaz. Bunu çok zaman gördüm. Sorun, sandalye ile klavye arasındaki araçta değil.
Abhishek Asthana

4
@KorayTugay, XPath ifadesi /*/book[1]/title/@lang seçer 0 ya da daha fazla özellik düğümlerin bir düğüm grubu, XPath ifadesi ise string(/*/book[1]/title/@lang)değerlendirildi, bu düğüm kümesi dize değeri - üretir ve bu (belge sırayla) ilk dize değeridir Bu düğüm kümesinden düğüm.
Dimitre Novatchev

4
@KorayTugay, Hayır, ilk ifade seçer , "döndürmez" - bir düğüm kümesi ve bu düğüm kümesi bir dize değildir. Düğüm bir dize değildir - bir düğüm ağaçtaki bir düğümdür . XML belgesi bir düğüm ağacıdır. lang="eng", "lang" adlı bir ad düğümüne, bir ad alanına ait olmayan ve "eng" dize değerine sahip bir dize değerine sahip bir öznitelik düğümünün birçok metinsel temsilinden yalnızca biri
Dimitre Novatchev

1
@Vladimir, V, "my: vvv" adındaki bir ad-alanı-uri'ye karşılık geliyorsa, XPP motorunun ana bilgisayarında myPrefix'i (v olabilir ama gerekli olmayabilir) aynı ad alanıyla ilişkilendiren bir eşleme kullanılabilir. -uri "my: vvv". Ve sonra nitelik şu şekilde seçilecektir: title / @ myPrefix: lang. Böyle bir eşlemenin nasıl oluşturulduğu uygulamaya özgüdür ve XPath motorunun ana bilgisayarının belgelerinde okunması gerekir. Bu, .NET'te belirli bir şekilde ve diyelim ki Saxon'da başka bir şekilde yapılır. Böyle bir eşlemeniz yoksa şunları kullanın: title / @ * [name () = 'v: lang']
Dimitre Novatchev

47

Teşekkürler! Bu Div içinde bir veri özniteliği ile benzer bir sorunu çözdü.

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

Bu xpath'i kullanın: //*[@id="prop_sample"]/@data-want

Umarım bu başka birine yardımcı olur!


6

XPath deseninin altında deneyebilirsiniz,

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

5
/ Bookstore / book altında bir lang niteliği olan herhangi bir XML başlık öğesini seçecektir . örneğin, tek bir
JFK

2

Ayrıca alabilirsiniz

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

JavaScript ile XMLDOM kullanıyorsanız, benzer bir şeyi kodlayabilirsiniz

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

ve n1.textsana değer verecek"eng"


2

kullanabilirsiniz:

(//@lang)[1]

bu, adı "lang" e eşit olan tüm öznitelik düğümlerini aldığınız ve birincisini aldığınız anlamına gelir.


0

İşte XPath ve VTD-XML ile "lang" öznitelik değerini alma snippet'i.

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 kullanıyorsanız, bunu elde etmenin doğru yolu budur. Bu, yalnızca bir kitap tablosu TITLE ve PRICE sütununun bulunduğu verilerle doldurulduğu bir varsayımdır . İşte sorgu

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.