使用XPath获取属性

给定一个这样的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)的值?

483093 次浏览

如何获取lang的值(在书名中lang=eng), for 第一个元素?< / p >

使用:

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

这意味着:

选择title元素的lang属性,它是XML文档顶部元素的第一个book子元素的子元素。

要获得此属性的字符串值,请使用标准XPath函数string():

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

谢谢!这解决了我在Div中使用数据属性时遇到的类似问题。

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

使用这个xpath: //*[@id="prop_sample"]/@data-want

希望这能帮助到其他人!

你可以试试下面的xPath模式,

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

你也可以通过

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"

下面是使用XPath和VTD-XML获取“lang”属性值的代码片段。

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());
}
}

你可以使用:

(//@lang)[1]

这意味着您将获得name等于“lang”的所有属性节点,并获得第一个。

如果你正在使用PostgreSQL,这是获得它的正确方法。这只是一个假设,因为你有一个带有填充数据的标题价格列。下面是问题

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

使用XPath提取属性值的标准公式是

elementXPath/@attributeName

这里是获取第一个属性-的lang值的xpath

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

PS:不建议在XPath中使用索引,因为如果再加入一个标题标记,索引就会发生变化。