Я учусь XML. Когда я пытаюсь разархивировать файл xml в класс, у меня возникает проблема. Я думаю, что это связано с пространством имен и атрибутами рядом с элементом root, потому что когда я удаляю атрибуты пространства имен, код работает. Есть код xml:
<?xml version="1.0"?>
<planes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:Planes.Namespace"
xsi:schemaLocation="urn:Planes.Namespace planes.xsd">
<Plane>
<model>AN-225</model>
<origin>Ukraine</origin>
<chars type="transport">
<numberOfSeedsForCrew>6</numberOfSeedsForCrew>
<characteristics>
<carryingCapacity>250000</carryingCapacity>
<numberOfPassengers>70</numberOfPassengers>
</characteristics>
<radarAvailability>true</radarAvailability>
</chars>
<parameters>
<length>84.0</length>
<width>94.8</width>
<height>18.1</height>
</parameters>
<price>300000</price>
</Plane>
<Plane>
<model>AN-148</model>
<origin>Ukraine</origin>
<chars type="passengers">
<numberOfSeedsForCrew>5</numberOfSeedsForCrew>
<characteristics>
<carryingCapacity>42000</carryingCapacity>
<numberOfPassengers>85</numberOfPassengers>
</characteristics>
<radarAvailability>true</radarAvailability>
</chars>
<parameters>
<length>29.13</length>
<width>33.91</width>
<height>8.19</height>
</parameters>
<price>7400</price>
</Plane>
<Plane>
<model>AT-56</model>
<origin>USA</origin>
<chars type="agricultural">
<numberOfSeedsForCrew>1</numberOfSeedsForCrew>
<characteristics>
<carryingCapacity>7257</carryingCapacity>
<numberOfPassengers>0</numberOfPassengers>
</characteristics>
<radarAvailability>false</radarAvailability>
</chars>
<parameters>
<length>11.7</length>
<width>18.68</width>
<height>3.8</height>
</parameters>
<price>893.9</price>
</Plane>
</planes>
И схема:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:Planes.Namespace"
xmlns="urn:Planes.Namespace"
elementFormDefault="qualified">
<xsd:element name="planes">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Plane"
type="Plane"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="Plane">
<xsd:sequence>
<xsd:element name="model" type="ModelName"/>
<xsd:element name="origin" type="xsd:string"/>
<xsd:element name="chars" type="Chars"/>
<xsd:element name="parameters" type="Parameters"/>
<xsd:element name="price" type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="ModelName">
<xsd:restriction base="xsd:string"><xsd:pattern value="[A-Z]{2,4}-[1-9]{2,4}"/></xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="Chars">
<xsd:sequence>
<xsd:element name="numberOfSeedsForCrew" type="xsd:positiveInteger"/>
<xsd:element name="characteristics" type="Characteristics"/>
<xsd:element name="radarAvailability" type="xsd:boolean"/>
</xsd:sequence>
<xsd:attribute name="type">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="transport"></xsd:enumeration>
<xsd:enumeration value="passengers"></xsd:enumeration>
<xsd:enumeration value="freight"></xsd:enumeration>
<xsd:enumeration value="fire"></xsd:enumeration>
<xsd:enumeration value="agricultural"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
<xsd:complexType name="Characteristics">
<xsd:sequence>
<xsd:element name="carryingCapacity" type="xsd:positiveInteger"/>
<xsd:element name="numberOfPassengers" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Parameters">
<xsd:sequence>
<xsd:element name="length" type="xsd:double"/>
<xsd:element name="width" type="xsd:double"/>
<xsd:element name="height" type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Есть код UnMarshaler:
public class MyUnMarshaller {
public static void unmarshal(){
try {
JAXBContext jc = JAXBContext.newInstance(Planes.class);
Unmarshaller u = jc.createUnmarshaller();
FileReader reader = new FileReader("src/main/resources/planes.xml");
Planes planes = (Planes) u.unmarshal(reader);
System.out.println(planes);
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Классовые плоскости:
@XmlRootElement
public class Planes {
@XmlElement(name = "Plane")
private List<Plane> planes = new ArrayList();
public Planes(){
super();
}
public void setPlanes(List<Plane> planes) {
this.planes = planes;
}
public void add(Plane plane){
planes.add(plane);
}
@Override
public String toString() {
return "Planes{" +
"planes=" + planes +
'}';
}
}
И класс Plane:
@XmlRootElement
@XmlType(name = "Plane", propOrder = {
"model",
"origin",
"chars",
"parameters",
"price"
})
public class Plane {
private String model;
private String origin;
private Chars chars;
private Parameters parameters;
private double price;
public Plane() { }
public Plane(String model, String origin, Chars chars, Parameters parameters, double price) {
this.model = model;
this.origin = origin;
this.chars = chars;
this.parameters = parameters;
this.price = price;
}
public String getModel() {
return model;
}
@XmlElement
public void setModel(String model) {
this.model = model;
}
public String getOrigin() {
return origin;
}
@XmlElement
public void setOrigin(String origin) {
this.origin = origin;
}
public Chars getChars() {
return chars;
}
@XmlElement
public void setChars(Chars chars) {
this.chars = chars;
}
public Parameters getParameters() {
return parameters;
}
@XmlElement
public void setParameters(Parameters parameters) {
this.parameters = parameters;
}
public double getPrice() {
return price;
}
@XmlElement
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Plane{" +
"model='" + model + '\'' +
", origin='" + origin + '\'' +
", chars=" + chars +
", parameters=" + parameters +
", price=" + price +
'}';
}
Вывод исключения:
javax.xml.bind.UnmarshalException: unexpected element (uri:"urn:Planes.Namespace", local:"planes"). Expected elements are <{}characteristics>,<{}chars>,<{}parameters>,<{}plane>,<{}planes>
Может кто-нибудь объяснить мне, где проблема исключения?