简单框架 - 从带有计数器的标签解析列表

时间:2015-02-09 22:56:44

标签: java xml simple-framework

在我的地图项目中,我使用simple-framework xml parser,我需要解析讨厌的" xml"这是GPS数据的变体。格式类似于:

<data>
    <name>SL12-34</name>
    <planename>C-172 SP-TZI</planename>
    ...
    <track>
        <rt0>
            <lat>49,23844</lat>
            <lon>18,034135</lon>
            <name>EPKM</name>
            <course>48</course>
            <distance>18,568</distance>
        </rt0>
        <rt1>
            <lat>49,350014</lat>
            <lon>18,228509</lon>
            <name> 2</name>
            <course>0</course>
            <distance>49,004</distance>
        </rt1>
        ...
        <rt18>
            <lat>49,350014</lat>
            <lon>18,221422</lon>
            <name> 19</name>
            <course>227</course>
            <distance>18,197</distance>
        </rt18>
    </track>
</data>

我的Waypoint课程:

@Root(name = "rt????")
public class Waypoint {
    @Element
    public double lat;

    @Element
    public double lon;

    @Element
    public String name;

    @Element
    public String course;

    @Element
    public double distance;
}

我的问题是 - 主类必须如何解析这个xml(使用simple-framework xml parser)来获得List<Waypoint>?我这里没有概念:/

1 个答案:

答案 0 :(得分:1)

我认为你不能使用数据绑定框架来做到这一点。您可以通过逐步执行DOM(手动或通过XPath)或使用data projection而不是数据绑定来完成此操作。 (披露:我是该项目的附属机构)

import java.util.List;
import org.xmlbeam.XBProjector;
import org.xmlbeam.annotation.XBRead;
public class ReadWayPoints {

    public interface WayPoint {
        @XBRead("./lat using #,#")
        double getLat();
        @XBRead("./lon using #,#")
        double getLon();
        @XBRead("./name")
        String getName();
        @XBRead("./course") 
        String getCourse();
        @XBRead("./distance using #,#")
        double getDistance();
    }
    public static void main(String[] args) {
        List<WayPoint> waypoints = new XBProjector().io().url("res://data.xml").evalXPath("/data/track/*").asListOf(WayPoint.class);
        for (WayPoint wp:waypoints) {
            System.out.println(wp.getName()+" "+wp.getLat()+":"+wp.getLon());                
        }
    }
}

删除示例中的...后,此程序打印出:

EPKM 49.23844:18.034135
 2 49.350014:18.228509
 19 49.350014:18.221422

为什么这样做?通过使用表达式/data/track/*,您将<track>的每个直接子元素投影到投影界面WayPoint。您甚至可以在接口中添加方法@XBRead("name()") String getName()以获取当前元素名称。