关于xml:使用XPath获取属性

Getting attribute using XPath

给定这样的XML结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML
  <price>39.95</price>
</book>

</bookstore>

我怎样才能得到第一个元素的lang(其中lang在书名中是eng)的值?


How could I get the value of lang (where lang=eng in book title), for
the first element?

用途:

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

这意味着:

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

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

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


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

1
data I do not want

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

希望这能帮助别人!


您可以尝试使用下面的xpath模式,

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


你也可以通过

1
2
string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)

不过,如果将xmldom与javascript结合使用,则可以编写类似的代码

1
var n1 = uXmlDoc.selectSingleNode("//bookstore/book[1]/title/@lang");

n1.text会给你值"eng"


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

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

你可以使用:

1
(//@lang)[1]

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


下面是使用xpath和vtd-xml获取"lang"属性值的片段。

1
2
3
4
5
6
7
8
9
10
11
12
13
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());
    }
}