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

Simple Framework - parse list from tags with counter

在我的地图项目中,我使用 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>

我的航点class:

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

我的问题是 - main class 必须如何解析此 xml(使用 simple-framework xml parser)以获得 List<Waypoint>?我在这里没有概念:/

我认为您不能使用数据绑定框架来做到这一点。您可以通过单步执行 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() 以获取当前元素名称。