使用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(这里langeng在书名),第一个元素?


Answers:


472

如何获取第一个元素的lang值(书名中lang = eng)?

用途

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

这表示

选择lang作为第一个子元素的title元素的属性book XML文档top元素孩子。

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

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

3
@AbhishekAsthana,对XPath表达式求值的结果恰好产生该lang属性的字符串值。如果该属性不包含任何方括号,则它们将不属于XPath表达式求值结果的一部分。我的猜测是,这些是由您使用的(不合适的)工具添加的。
Dimitre Novatchev 2014年

6
是的,我发现了问题..soapUI就是这样显示它的,但是当我使用xpath值时不使用那些括号。我已经看到很多时间了。问题不在于椅子和键盘之间的工具。
Abhishek Asthana 2014年

4
@ KorayTugay,XPath表达式/*/book[1]/title/@lang 选择一个0个或更多属性节点的节点集,而XPath表达式string(/*/book[1]/title/@lang)在求值时会生成此节点集的字符串值-这是第一个(按文档顺序)的字符串值此节点集中的节点。
Dimitre Novatchev 2014年

4
@KorayTugay,不,第一个表达式选择,不“返回”-一组节点,而该组节点不是字符串。节点不是字符串-节点是树中的节点。XML文档是节点树。lang="eng"只是属性节点的许多文本表示形式之一,该属性节点具有名称“ lang”,不属于命名空间,并且具有字符串值字符串“ eng”
Dimitre Novatchev 2014年

1
@Vladimir,如果v对应于一个命名空间uri,例如:“ my:vvv”,则可以在XPath引擎的主机中创建一个正在使用的映射,该映射将myPrefix(可能是v,但不是必需的)与同一个命名空间相关联-uri“ my:vvv”。然后,将使用以下标题选择该属性:title / @ myPrefix:lang。如何创建这种映射是特定于实现的,并且必须阅读XPath引擎主机的文档。这是在.NET中以特定方式完成的,而在Saxon中则以另一种方式完成。如果没有任何此类映射,请使用:title / @ * [name()='v:lang']
Dimitre Novatchev

47

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

<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
这将选择/ bookstore / book下任何具有lang属性值eng而不是lang值的XML title元素。即它选择的元素,而不是一个单一的属性的列表,
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

这是使用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());
    }
}

0

如果您使用的是PostgreSQL,这是获取它的正确方法。这只是一个假设,因为您有一个带有填充数据的TITLEPRICE列。这是查询

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.