给定这样的 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
)?
对于第一个元素,我如何获得 lang 的值(其中 lang=eng 在书名中)?
利用:
/*/book[1]/title/@lang
这表示:
选择作为 XML 文档顶部元素的第一个 book
子元素的子元素的 title 元素的 lang
属性。
要仅获取此属性的字符串值,请使用标准 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']")
如果您使用的是 PostgreSQL,那么这是获取它的正确方法。这只是一个假设,因为您有一个包含填充数据的图书表 TITLE 和 PRICE 列。这是查询
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 中使用索引,因为如果再添加一个标题标签,它们可能会发生变化。
你也可以通过
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"
您可以使用:
(//@lang)[1]
这意味着您将获得名称等于“lang”的所有属性节点并获得第一个。
这是使用 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
属性的字符串值。如果属性不包含任何方括号,则它们不会成为 XPath 表达式求值结果的一部分。我的猜测是这些是由您正在使用的(不适当的)工具添加的。/*/book[1]/title/@lang
选择 0 个或多个属性节点的节点集,而 XPath 表达式string(/*/book[1]/title/@lang)
在评估时生成此节点集的字符串值——和这是此节点集中第一个(按文档顺序)节点的字符串值。lang="eng"
只是属性节点的众多文本表示之一,该属性节点具有名称“lang”,不属于命名空间,并且具有字符串值“eng”