web-dev-qa-db-fra.com

Obtenir un attribut en utilisant XPath

Étant donné une structure XML comme celle-ci:

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

Comment obtenir la valeur lang (où lang est eng dans le titre du livre), pour le premier élément?

299
dotnetdev

Comment pourrais-je obtenir la valeur de lang (où lang = eng dans le titre du livre), pour le premier élément?

Utilisation :

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

Ça signifie :

Sélectionnez l'attribut lang de l'élément title qui est un enfant du premier book enfant de l'élément supérieur du document XML.

Pour obtenir uniquement la valeur de chaîne de cet attribut, utilisez la fonction standard XPath string():

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

Merci! Cela a résolu un problème similaire que j'avais avec un attribut de données à l'intérieur d'une div. 

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

Utilisez ce xpath: //*[@id="prop_sample"]/@data-want

J'espère que ceci aide quelqu'un d'autre!

34
smulldino

Vous pouvez essayer ci-dessous le modèle xPath, 

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

Vous pouvez aussi l'obtenir par

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

bien que si vous utilisez XMLDOM avec JavaScript, vous pouvez coder quelque chose comme:

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

et n1.text vous donnera la valeur "eng"

1
Vinod Srivastav

Si vous utilisez PostgreSQL, c'est la bonne façon de l'obtenir. Ceci est juste une hypothèse dans laquelle vous avez une colonne book tableTITLEetPRICEavec des données renseignées. Voici la requête

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

vous pouvez utiliser:

(//@lang)[1]

cela signifie que vous obtenez tous les attributs avec un nom égal à "lang" et que vous obtenez le premier.

0
starcwl

Voici l'extrait permettant d'obtenir la valeur d'attribut de "lang" avec XPath et 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());
    }
}
0
vtd-xml-author