在我的地图项目中,我使用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>
?我这里没有概念:/
答案 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()
以获取当前元素名称。