Obter o atributo com o XPath

dada uma estrutura XML como esta:

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

Como posso obter o valor de lang (onde lang está eng no título do livro), para o primeiro elemento?

 359
Author: Amal Murali, 2010-12-25

8 answers

Como poderia obter o valor de lang (onde lang = eng no título do livro), para o primeiro elemento?

Utilização:

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

Isto significa:

Seleccione o atributo lang do elemento título que é filho do primeiro book Filho do elemento superior do documento XML.

Para obter apenas o valor de string deste atributo use a função padrão XPathstring():

string(/*/book[1]/title/@lang)
 499
Author: Dimitre Novatchev, 2017-12-11 14:53:48
Obrigado! Isso resolveu um problema semelhante que eu tinha com um atributo de dados dentro de um Div.
<div id="prop_sample" data-want="data I want">data I do not want</div>

Utilize este xpath: //*[@id="prop_sample"]/@data-want

Espero que isto ajude outra pessoa!
 52
Author: smulldino, 2015-12-10 08:45:24

Pode tentar abaixo do padrão xPath,

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")
 7
Author: Sharath, 2015-02-03 09:50:42

Você também pode obtê-lo por

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

Embora se estiver a usar o XMLDOM com o JavaScript possa codificar algo como

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

E n1.text Dar-te-ão o valor "eng"

 2
Author: Vinod Srivastav, 2016-03-01 15:13:42

Pode usar:

(//@lang)[1]

Isto significa que se obtém todos os nós de atributos com nome igual a "lang" e se obtém o primeiro.

 2
Author: starcwl, 2018-08-23 12:59:26

Aqui está o excerto de obter o valor dos atributos de "lang" com XPath e 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
Author: vtd-xml-author, 2017-06-21 00:00:13

Se está a usar o PostgreSQL, esta é a forma correcta de O obter. Isto é apenas uma suposição em que, como você tem um livro Tabela Título e Preço coluna com dados povoados. Aqui está a pergunta

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
 0
Author: Royce, 2018-08-26 01:55:34

A fórmula-padrão para extrair os valores do atributo que utiliza o XPath é

elementXPath/@attributeName

Então aqui está o xpath para obter o valor lang do Primeiro atributo -

//title[text()='Harry Potter']/@lang

PS: os índices nunca são sugeridos para usar em XPath, pois podem mudar se mais uma etiqueta de título entrar.

 0
Author: SelectorsHub - The XPathTool, 2020-12-12 17:04:44