Получение атрибута с использованием XPath - PullRequest
313 голосов
/ 26 декабря 2010

Учитывая 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 (где lang равно eng в названии книги) для первого элемента?

Ответы [ 7 ]

427 голосов
/ 26 декабря 2010

Как я могу получить значение lang (где lang = eng в названии книги), для первый элемент?

Используйте

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

Это означает :

Выберите атрибут lang элемента title, который является дочерним по отношению к первому book дочернему элементу верхнего элемента XML-документа.

Чтобы получить только строковое значение этого атрибута, используйте стандартную функцию XPath string():

string(/*/book[1]/title/@lang)
37 голосов
/ 24 января 2015

Спасибо! Это решило похожую проблему с атрибутом данных внутри Div.

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

Используйте этот xpath: //*[@id="prop_sample"]/@data-want

Надеюсь, это поможет кому-то еще!

3 голосов
/ 03 февраля 2015

Вы можете попробовать ниже шаблон xPath,

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")
1 голос
/ 01 марта 2016

Вы также можете получить его по

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

хотя, если вы используете XMLDOM с JavaScript, вы можете написать что-то вроде

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

и n1.text даст вам значение "eng"

0 голосов
/ 26 августа 2018

Если вы используете 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 голосов
/ 23 августа 2018

вы можете использовать:

(//@lang)[1]

это означает, что вы получаете все узлы атрибутов с именем, равным "lang", и получаете первый.

0 голосов
/ 21 июня 2017

Вот фрагмент получения значения атрибута "lang" с XPath и 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...