我正在开发一个项目,我将使用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>
答案 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;
其他一些快速说明:
StationList
应为stationList
。@XMLRootElement
注释所有顶级数据类。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
}