JAXB XML解析的问题

时间:2013-04-14 18:53:23

标签: java xml list xml-parsing jaxb

我正在开发一个项目,我将使用JAXB来解析包含以下气象站信息的XML文件:名称,站点ID,纬度/经度和URL。现在我打算通过仅按名称打印气象站来测试所有内容。我调试了我的代码但是当我尝试运行时:我收到以下错误:

线程“main”中的异常javax.xml.bind.UnmarshalException:意外元素(uri:“”,local:“wx_station_index”)。预期的元素是(无)

有没有人有解释?任何帮助,将不胜感激。我的代码和XML示例发布在下面:

//create criteria for weather station info
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class StationTest {

/**
 * @param args
 */

@XmlElement(name = "station_id")
String station_id;

@XmlElement(name = "state")
String state;

@XmlElement(name = "station_name")
String stationName;

@XmlElement(name = "latitude")
double latitude;

@XmlElement(name = "longitude")
double longitude;

@XmlElement(name = "html_url")
String htmlUrl;

public String getStationID(){
    return station_id;
}

public void setStationId(String station_id)
{
     this.station_id = station_id;
}

public String getState(){
    return state;
}

public void setState(String state)
{
     this.state = state;
}

public String getStationName(){
    return stationName;
}

public void setStationName(String station_name)
{
     this.stationName = stationName;
}

public double getLatitude(){
    return latitude;
}

public void setLatitude(double latitude)
{
     this.latitude = latitude;
}

public double getLongitude(){
    return longitude;
}

public void setLongitude(double longitude)
{
     this.longitude = longitude;
}

public String getUrl(){
    return htmlUrl;
}

public void setUrl(String url){
    this.htmlUrl = htmlUrl;

}

}     import java.util.ArrayList;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlAccessType;

//create list for all weather stations

@XmlRootElement
@XmlSeeAlso(value = StationTest.class)
@XmlAccessorType(XmlAccessType.FIELD)
public class StationListTest {

/**
 * @param args
 */
@XmlElement(name = "station")
private ArrayList<StationTest> stationList;

public void setStationListTest(ArrayList<StationTest> StationList){
    this.stationList = StationList;
}

public ArrayList<StationTest> getStationListTest(){
    return stationList;
}

}

import java.util.ArrayList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;

 import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

//final Test of JAXB
public class Test3 {

/**
 * @param args
 */
//read xml
private static final String STATION_XML = "src/flwxindex3.xml";

//main method
public static void main(String[] args) throws InterruptedException, JAXBException, FileNotFoundException {

    //create list object
    ArrayList<StationTest> StationList = new ArrayList<StationTest>();

    final JAXBContext jaxbc = JAXBContext.newInstance(StationListTest.class);
    final Unmarshaller unmarshaller = jaxbc.createUnmarshaller();

    //create list for iteration, then iterate printing by name only
    StationListTest stationListTest = (StationListTest) unmarshaller.unmarshal(new FileReader(STATION_XML));
    ArrayList<StationTest> list = stationListTest.getStationListTest();
    //final StationListTest stations = (StationListTest) unmarshaller.unmarshal(Thread.currentThread().getContextClassLoader().getResource("src/flwxindex3.xml"));
    for (final StationTest station : list) {
        System.out.println(station.getStationName());
    }
}

}

请求的实际xml(以为我包括它,抱歉):

<?xml version="1.0" encoding="UTF-8"?>
<wx_station_index>
    <credit>NOAA's National Weather Service</credit>
    <credit_URL>http://weather.gov/</credit_URL>
    <image>
            <url>http://weather.gov/images/xml_logo.gif</url>
            <title>NOAA's National Weather Service</title>
            <link>http://weather.gov</link>
    </image>
    <suggested_pickup>08:00 EST</suggested_pickup>
    <suggested_pickup_period>1140</suggested_pickup_period>

<station>
    <station_id>NFNA</station_id>
    <state>FJ</state>
    <station_name>Nausori</station_name>
    <latitude>-18.05</latitude>
    <longitude>178.567</longitude>
    <html_url>http://weather.noaa.gov/weather/current/NFNA.html</html_url>
    <rss_url>http://weather.gov/xml/current_obs/NFNA.rss</rss_url>
    <xml_url>http://weather.gov/xml/current_obs/NFNA.xml</xml_url>
</station>

<station>
    <station_id>KCEW</station_id>
    <state>FL</state>
            <station_name>Crestview, Sikes Airport</station_name>
    <latitude>30.79</latitude>
    <longitude>-86.52</longitude>
            <html_url>http://weather.noaa.gov/weather/current/KCEW.html</html_url>
            <rss_url>http://weather.gov/xml/current_obs/KCEW.rss</rss_url>
            <xml_url>http://weather.gov/xml/current_obs/KCEW.xml</xml_url>
</station>

2 个答案:

答案 0 :(得分:2)

假设wx_station_index不是拼写错误。

我添加了一些注释来指示jaxb在xml的哪个部分映射代码的哪一部分。将StationListTest更改为以下内容应该可以更好地工作。

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

//create list for all weather stations
@XmlRootElement(name="wx_station_index")
public class StationListTest {

/**
 * @param args
 */
@XmlElement(name="station")    
private ArrayList<StationTest> StationList;

public StationListTest(){
    StationList=new ArrayList<StationTest>();
}

public void setStationListTest(ArrayList<StationTest> StationList){
    this.StationList = StationList;
}

public ArrayList<StationTest> getStationListTest(){
    return StationList;
}

}

答案 1 :(得分:1)

StationList上的命名属性StationListTest与XML文档中的隐式station列表属性不匹配。这需要通过显式定义要填充StationList属性的XML的哪些元素来解决:

@XmlElement(name = "station")
private ArrayList<StationTest> StationList;

其他一些快速说明:

  • 您应该遵循类名和变量名的Java命名模式(驼峰案例)。因此,StationList应为stationList
  • 作为一般规则,您应使用@XMLRootElement注释所有顶级数据类。
  • 作为一般规则,在定义Java类(List而不是ArrayList)时,应使用类型的最通用形式。
  • 您应该使用@XmlSeeAlso
  • 指明映射中涉及的其他类

以下类定义适用于您的XML:

@XmlRootElement(name = "station")
@XmlAccessorType(XmlAccessType.FIELD)
public class StationTest {

    @XmlElement(name = "station_id")
    String stationId;

    String state;

    @XmlElement(name = "station_name")
    String stationName;

    double latitude;
    double longitude;

    @XmlElement(name = "html_url")
    String htmlUrl;

    // Constructor, getters, setters
}

@XmlRootElement(name = "wx_station_index")
@XmlSeeAlso(value = StationTest.class)
@XmlAccessorType(XmlAccessType.FIELD)
public class StationListTest {
    @XmlElement(name = "station")
    private List<StationTest> stationList;

    // Constructors, getters, setters
}