Получение атрибута с использованием XPath

244

Для такой структуры 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 в заголовке книги), для первого элемента?

Теги:
xpath

5 ответов

320
Лучший ответ

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

Использование

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

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

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

Чтобы получить только строковое значение этого атрибута, используйте:

string(/*/book[1]/title/@lang)
  • 0
    Я использовал строковый метод и получил значение в квадратных скобках [attribute_value] . Есть ли способ получить значение атрибута без квадратных скобок?
  • 3
    @AbhishekAsthana, результат вычисления выражения XPath дает в точности строковое значение атрибута lang . Если атрибут не содержит квадратных скобок, они не будут частью результата вычисления выражения XPath. Я предполагаю, что они добавляются (неподходящим) инструментом, который вы используете.
Показать ещё 6 комментариев
25

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

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

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

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

2

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

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")
  • 5
    Это выберет любой элемент заголовка XML в / bookstore / book, имеющий атрибут lang со значением eng, а не со значением lang. т.е. он выбирает список элементов, а не один атрибут
1

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

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

Вот фрагмент получения значения атрибута "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 value is ===>"+ap.evalXPathToString());
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню