如何使用 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
我正在从 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