JAXB XML解析的问题

问题描述:

我正在使用JAXB解析包含以下气象站信息的XML文件:名称,工作站ID,纬度/经度和网址。现在我打算通过仅打印一个气象站来测试一切。我调试了我的代码,但是当我尝试运行时:出现以下错误:JAXB XML解析的问题

线程“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; 

} 

} 进口的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> 
+0

你能提供实际的XML请。 – 3xil3

+0

刚刚添加我的xml。 – David

+0

不确定它是否为复制粘贴错误或由设计人员满意,但未关闭。如果是通过设计,这意味着我们期望有一个wx_station_index元素,我们期望找到这个元素。在你的java代码中,我们正在处理一个站列表(如果你只有站内元素,这将是正确的) – 3xil3

假设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; 
} 

} 
+0

嘿大家。谢谢您的帮助。代码正在工作。 – David

有指定属性StationList之间您StationListTest类和XML文档中的隐含station列表属性不匹配。这需要通过明确界定哪些要素的XML的StationList财产从填充来解决:

@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 
} 
+0

谢谢。我有一个问题:对于@XmlAccessorType(XmlAccessType。FIELD)' - 我得到一个错误,XMLAccessType不能被解析为一个变量。如果我注释掉并尝试运行我的整个程序,我的错误是这样的:线程“main”中的异常javax.xml.bind.UnmarshalException:意外的元素(uri:“”,local:“wx_station_index”)。预期的元素是, – David

+2

您需要导入'javax.xml.bind.annotation.XmlAccessType'。如果您使用的是Eclipse,您可以按Ctrl-Shift-o(或Mac上的Command-Shift-o)来组织导入。其他IDE具有类似的功能。 – Perception

+0

好的。完成。但我仍然得到错误:异常在线程“main”javax.xml.bind.UnmarshalException:意外元素(uri:“”,local:“wx_station_index”)。预期的元素是, - 感谢所有相同。 – David