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

How to retrieve value from xml file using XMLDog

我正在从 this tutorial 学习如何将 SAX 与 xpath 结合使用。 我写了下面的代码,但它 returns 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>

你的顺序错了。添加 xpath 表达式 before 嗅探:

    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(...));

它是对表达式求值的嗅探,在你的例子中有 none。

你应该在嗅探之前添加 xpaths:

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