2

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.
        }


    }
}
4

2 に答える 2

1

vn.toElement(vn.PARENT)はどうですか?

于 2012-07-15T05:24:07.447 に答える
1

私も同じ問題を抱えており、処理できませんでした(OSMデータにも取り組んでいます)

方法を使用しましたが、OSM のような大量のデータには効率的ではないと思います

方法内でノードを取得しようとしていますが、ノードが表示されたら、その親 ID を取得しようとしています

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);
        }

ネストされています(最初にウェイを検索してから、このウェイ内のノードまたはこのウェイ内のタグを検索しますが、今まで良い解決策が見つかりませんでした)

それが役に立ったことを願っています

于 2013-12-20T21:25:43.983 に答える