如何使用XMLDog从xml文件中检索值

时间:2015-07-24 14:42:21

标签: java xml xpath sax xmldog

我正在学习如何使用来自this tutorial的xpath的SAX。 我编写了下面的代码,但它返回null而不是显示' 30'

请让我知道如何解决它,是否还有其他库使用SAX和Xpath?

代码

DefaultNamespaceContext nsContext = new DefaultNamespaceContext(); // an implementation of javax.xml.namespace.NamespaceContext
    nsContext.declarePrefix("xsd", Namespaces.URI_XSD);

    XMLDog dog = new XMLDog(nsContext);
    XPathResults results = dog.sniff(new InputSource("c:\\brem.xml"));

    Expression xpath1 = dog.addXPath("//node[@lat='53.0334062'] [@lon='8.8461545']/following-sibling::tag[1]/@v");
    Log.d("", "", ""+results.getResult(xpath1));

XML

<?xml version='1.0' encoding='utf-8' ?>
<osm>
<node id="25779111" lat="53.0334062" lon="8.8461545"/>
<node id="25779112" lat="53.0338904" lon="8.846314"/>
<node id="25779119" lat="53.0337395" lon="8.8489255"/>
<tag k="maxspeed" v="30"/>
<tag k="maxspeed:zone" v="yes"/>
<node id="25779114" lat="53.334062" lon="8.841545"/>
<node id="25779117" lat="53.038904" lon="8.84614"/>
<node id="25779110" lat="53.033795" lon="8.489255"/>
<tag k="maxspeed" v="32"/>
<tag k="maxspeed:zone" v="no"/>
</osm>

2 个答案:

答案 0 :(得分:1)

你这样做的顺序错误。在嗅探前添加xpath表达式

    XMLDog dog = new XMLDog(nsContext);
    Expression xpath1 = dog.addXPath("//node[@lat='53.0334062'] [@lon='8.8461545']/following-sibling::tag[1]/@v");
    XPathResults results = dog.sniff(new InputSource(...));

评估表达式的嗅探,在你的案例中没有。

答案 1 :(得分:1)

你应该在嗅探前添加xpath:

DefaultNamespaceContext nsContext = new DefaultNamespaceContext();

XMLDog dog = new XMLDog(nsContext);
Expression xpath1 = dog.addXPath("//node[@lat='53.0334062'] [@lon='8.8461545']/following-sibling::tag[1]/@v");
XPathResults results = dog.sniff(new InputSource(""c:\\brem.xml"));
List<NodeItem> list = (List<NodeItem>)results.getResult(xpath1);
System.out.println(list.isEmpty() ? null : list.get(0).value);

打印:

30