UnMarshalException: неожиданные элементы - PullRequest
0 голосов
/ 11 апреля 2020

Я учусь 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>

Может кто-нибудь объяснить мне, где проблема исключения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...