[英]JAXB - unmarshalling a XML-File
我嘗試解組具有以下結構的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element name="country" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="x" type="xs:integer" />
<xs:element name="y" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
一個例子是:
<?xml version="1.0" encoding="UTF-8"?>
<map name="usa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="field.xsd">
<country>
<name>Test1</name>
<x>110</x>
<y>20</y>
</country>
<country>
<name>Test2</name>
<x>200</x>
<y>30</y>
</country>
<country>
<name>Test3</name>
<x>350</x>
<y>80</y>
</country>
</map>
為此,我創建了以下類:
package game.view.gui;
public class ObjectFactory {
public ObjectFactory() {
}
public Map createMap() {
return new Map();
}
}
和
package game.view.gui;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement( name = "map" )
public class Map {
@XmlAttribute
private String name;
private List<Country> countries = new ArrayList<Country>();
@XmlElement( name = "country" )
public List<Country> getCountries() {
return countries;
}
public void setCountries( List<Country> countries ) {
this.countries = countries;
}
}
和
package game.view.gui;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "country")
public class Country {
@XmlElement(required = true)
private String name;
@XmlElement(required = true)
private int x;
@XmlElement(required = true)
private int y;
public String getName() {
return name;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
我總是遇到一個異常,在該異常中,xml似乎不適合所創建的pojos。 我試圖做到與閱讀的教程相同。 異常出現在以下代碼行中:
Map map = (Map) unmarsh.unmarshal(file);
您能告訴我我需要在pojos中進行哪些更改以確保一切正常嗎?
Edit1:例外:
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"map"). Expected elements are (none)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
創建JAXBContext
(用於創建marshaller和unmarshaller實例)時,您需要傳遞架構的根類-通常,它們將使用@XmlType
和/或@XmlRootElement
進行標記,以便上下文知道哪個正在使用的類。 它不執行的操作是關閉並掃描您的類路徑上的所有類,以免它們可能有某些相關的要說的機會。 那會非常昂貴!
實際上,更改:
JAXBContext.newInstance();
至:
JAXBContext.newInstance(Map.class);
您可能還需要在注釋中顯式指定名稱空間映射(到空名稱空間)(例如,通過@XmlRootElement
注釋的namespace
字段),並且我發現調試JAXB上下文的最簡單方法通常是生成模式他們通過generateSchema
方法進行編碼(帶有偽輸出解析器,該偽輸出解析器僅使它們轉儲到System.out
…)
您創建的ObjectFactory
類缺少必需的@XmlRegistry
批注。 沒有此注釋, ObjectFactory
將被視為常規域對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.