Как я могу получить родительский элемент в vtd-xml?
У меня есть запрос xpath, и я могу получить все атрибуты и их соответствующие значения
но теперь я хочу знать, к какому элементу относится этот атрибут?
это мой xml:
<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="osmconvert 0.5Z">
<bounds minlat="51.60542" minlon="-0.1854331" maxlat="51.69193" maxlon="-0.0088394"/>
<node id="195870" lat="51.6844148" lon="-0.1772914" version="4" timestamp="2008-10-07T19:42:43Z" changeset="136213" uid="508" user="Welshie">
<tag k="highway" v="motorway_junction"/>
<tag k="ref" v="24"/>
</node>
<node id="33206602" lat="51.6084884" lon="-0.0365496" version="4" timestamp="2011-09-23T16:54:00Z" changeset="9378015" uid="28024" user="dbisping">
<tag k="amenity" v="fuel"/>
<tag k="fuel:biodiesel" v="yes"/>
<tag k="fuel:biogas" v="no"/>
<tag k="fuel:cng" v="no"/>
<tag k="fuel:diesel" v="no"/>
<tag k="fuel:hydrogen" v="no"/>
<tag k="fuel:lpg" v="no"/>
<tag k="fuel:octane_100" v="no"/>
<tag k="fuel:octane_95" v="no"/>
<tag k="fuel:octane_98" v="no"/>
<tag k="name" v="Pure Fuels"/>
<tag k="self_service" v="no"/>
</node>
</osm>
и код, который я написал:
import com.ximpleware.*;
public class Test2
{
public static void main (String[] abc)
{
VTDGen vg = new VTDGen();
vg.parseFile("C:\\workspace\\sample osm xml\\1.xml",false);
VTDNav nav = vg.getNav();
AutoPilot ap = new AutoPilot(nav);
try {
//ap.selectXPath("/osm/node/tag[@k='amenity']");
ap.selectXPath("//node/tag");
while (ap.evalXPath() != -1 )
{
//getting attribute first element
int val = nav.getAttrVal("k");
if (val != -1)
{
String element = "The element or node is ??? ";
String o = "key = " + nav.toNormalizedString(val) + " value = " +nav.toString(val + 2);
System.out.print(element);
System.out.println(o);
}
}
} catch (XPathParseException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (XPathEvalException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (NavException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
2 ответа
У меня такая же проблема, и я не мог справиться с ней (я также работаю с данными OSM)
Я использовал метод, но я думаю, что он неэффективен для большого количества данных, таких как OSM
Я пытаюсь получить узлы в пути, и когда я вижу узел, я пытаюсь получить его родительский идентификатор
int wayIndex = 1;
while (way_id_counter != -1)
{
start = System.currentTimeMillis();
wayID = vn.toString(way_id_counter+1);
apSubNode_id.resetXPath();
apSubNode_id.selectXPath("//way[" + wayIndex +"]/nd/@ref");
way_node_id_counter = apSubNode_id.evalXPath();
while (way_node_id_counter != -1)
{
subNodeID = vn.toString(way_node_id_counter+1);
//System.out.println("Sub node id is " + subNodeID);
way_node_id_counter = apSubNode_id.evalXPath();
}
wayIndex++;
way_id_counter = apWay_id.evalXPath();
//System.out.println("Way id is " + wayID);
//break;
end = System.currentTimeMillis();
System.out.println(end - start);
}
Он является вложенным (поиск путей сначала, затем узлов внутри этого пути или тегов внутри этого пути в вашем случае, но я не нашел хорошего решения до сих пор)
надеюсь, это помогло