Отримання атрибута за допомогою XPath


344

Враховуючи подібну 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в назві книги), для першого елемента?


2
дуже хороше посилання при використанні xpaths test-able.blogspot.ie/2016/04/xpath-selectors-cheat-sheet.html

Відповіді:


472

Як я міг отримати значення lang (де lang = eng у назві книги) для першого елемента?

Використання :

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

Це означає :

Виберіть langатрибут елемента заголовка, який є дочірньою частиною першої bookдитини верхнього елемента документа XML.

Для отримання лише рядкового значення цього атрибута використовуйте стандартну функцію XPathstring() :

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

3
@AbhishekAsthana, Результат оцінки виразу XPath створює саме рядкове значення langатрибута. Якщо атрибут не містить квадратних дужок, вони не будуть частиною результату оцінки виразу XPath. Я здогадуюсь, що вони додаються (невідповідним) інструментом, який ви використовуєте.
Димитрій Новатчев

6
так, я вирішив проблему. Ось як саме відображається soapUI, але ці дужки не використовуються, коли я використовую значення xpath. Я бачив це багато разів. Проблема не в тому, що інструмент .. його між стільцем і клавіатурою.
Abhishek Asthana

4
@KorayTugay, вираз XPath /*/book[1]/title/@lang вибирає набір вузлів 0 або більше атрибутивних вузлів, тоді як вираз XPath string(/*/book[1]/title/@lang)при оцінці виробляє значення рядка цього набору вузлів - і це значення рядка першого (у порядку документа) вузол з цього набору вузлів.
Димитрей Новатчев

4
@KorayTugay, Ні, перший вираз вибирається , не "повертається" - набір вузлів, і цей набір вузлів не є рядком. Вузол не є рядком - вузол - це вузол у дереві . Документ XML - це дерево вузлів. lang="eng"- лише одне з багатьох текстових зображень вузла атрибутів, який має ім'я "lang", не належить до простору імен і має рядкове значення рядка "eng"
Димитрей Новатчев,

1
@Vladimir, Якщо v відповідає простору імен - uri сказати: "my: vvv", тоді можна створити в хості двигуна XPath, використовуючи відображення, що асоціює myPrefix (може бути v, але не потрібно) до того ж простору імен -урі "мій: ввв". І тоді атрибут буде обраний за допомогою: title / @ myPrefix: lang. Як створюється таке відображення, залежить від реалізації, і його слід прочитати в документації хоста двигуна XPath. Це робиться певним чином у .NET та іншим способом, скажімо, у Saxon. Якщо у вас немає такого відображення, використовуйте: title / @ * [name () = 'v: lang']
Димитре Новатчев

47

Дякую! Це вирішило подібну проблему, яку я мав з атрибутом даних всередині Div.

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

Скористайтеся цим xpath: //*[@id="prop_sample"]/@data-want

Сподіваюся, це допоможе комусь іншому!


6

Ви можете спробувати нижче шаблон xPath,

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

5
Це вибере будь-який елемент заголовка XML в / bookstore / book, який має атрибут lang зі значенням eng, а не значенням lang. тобто він вибирає список елементів, а не один атрибут
JFK

2

Ви також можете отримати його

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"


2

Ви можете використовувати:

(//@lang)[1]

це означає, що ви отримуєте всі вузли атрибутів з ім'ям, рівним "lang", і отримуєте перший.


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's value is ===>"+ap.evalXPathToString());
    }
}

0

Якщо ви використовуєте PostgreSQL, це правильний спосіб отримати його. Це всього лише припущення , де у вас є книга таблиця TITLE і ЦІНИ стовпець з населеними даними. Ось запит

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.