使用XPath获取属性

Gur*_*epS 328 xml 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>
Run Code Online (Sandbox Code Playgroud)

我怎么能得到的值lang(这里langeng在书名),第一个元素?

Dim*_*hev 448

对于第一个元素,我怎样才能获得lang(其中lang = eng in book title)的值?

用途:

/*/book[1]/title/@lang
Run Code Online (Sandbox Code Playgroud)

这意味着:

选择langtitle元素的属性,该属性是bookXML文档顶部元素的第一个子元素的子元素.

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

string(/*/book[1]/title/@lang)
Run Code Online (Sandbox Code Playgroud)

  • 是的,我想出了问题..这就是soapUI如何显示它但是当我使用xpath值时不使用这些括号.我已经看到了很多时间.问题不在于椅子和键盘之间的工具. (6认同)
  • @KorayTugay,XPath表达式`/*/book [1]/title/@ lang`**选择**一个0或更多属性节点的节点集,而XPath表达式`string(/*/book [1]/title/@lang)`在计算时,生成此节点集的字符串值 - 这是此节点集中第一个(按文档顺序)节点的字符串值. (4认同)
  • @KorayTugay,不,第一个表达式**选择**,不"返回" - 一组节点,这组节点不是字符串.节点不是字符串 - 节点是**树中的节点**.XML文档是节点树.`lang ="eng"`只是属性节点的许多文本表示之一,其名称为"lang",不属于命名空间,并且字符串值为字符串"eng" (4认同)
  • @AbhishekAsthana,评估XPath表达式的结果恰好产生了`lang`属性的字符串值.如果属性不包含任何方括号,则它们不会成为XPath表达式求值结果的一部分.我的猜测是这些是你正在使用的(不合适的)工具添加的. (3认同)
  • @Vladimir,如果 v 对应于命名空间 uri:“my:vvv”,那么可以在正在使用的 XPath 引擎的主机中创建一个将 myPrefix (可能是 v 但不是必需的)关联到同一命名空间的映射-uri“我的:vvv”。然后将使用以下方式选择属性:title/@myPrefix:lang。如何创建这样的映射是特定于实现的,并且必须阅读 XPath 引擎主机的文档。这是在 .NET 中以特定方式完成的,在 Saxon 中以另一种方式完成的。如果您没有任何此类映射,请使用:title/@*[name()='v:lang'] (2认同)

小智 44

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

<div id="prop_sample" data-want="data I want">data I do not want</div>
Run Code Online (Sandbox Code Playgroud)

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

希望这有助于其他人!


小智 7

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

elementXPath/@attributeName
Run Code Online (Sandbox Code Playgroud)

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

//title[text()='Harry Potter']/@lang
Run Code Online (Sandbox Code Playgroud)

PS:永远不建议在 XPath 中使用索引,因为如果再出现一个标题标签,它们可能会发生变化。


Sha*_*ath 5

您可以尝试以下xPath模式,

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")
Run Code Online (Sandbox Code Playgroud)

  • 这将选择/ bookstore / book下的任何XML ** title元素**,它们的lang属性的值为eng,而不是lang的值。即,它选择元素列表,而不是单个属性 (5认同)