3

応答メッセージの xsd が提供されており、xml 応答を jaxb 生成クラスに解析しようとしています。最初に、ルート xml 要素が「response」と呼ばれる問題がありましたが、「response」と呼ばれるネストされたクラスもあったため、コンパイル エラーが発生していました。これを修正するために、xsd で jaxb:class アノテーションを使用して、ネストされたクラスが「response」ではなく「callReport7Response」として生成されるように作成されたネストされた Java クラスの名前を変更できることがわかりました。

<xs:element name="callReport7" minOccurs="0">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="request">
            <xs:annotation><xs:appinfo><jaxb:class name="callReport7Request"/></xs:appinfo></xs:annotation>
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="xs:anyType">
                            <xs:attribute name="time" type="xs:string"/>
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="response">
            <xs:annotation><xs:appinfo><jaxb:class name="callReport7Response"/></xs:appinfo></xs:annotation>
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="xs:anyType">
                            <xs:attribute name="time" type="xs:string"/>
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

残念ながら、応答をアンマーシャリングしようとすると、「callReport7Response」を「response」に解析できないというエラーが表示されます

Java は次のようになります。

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"any"})
        @XmlRootElement(name = "response")
        public static class CallReport7Response {

            @XmlAnyElement
            protected List<Element> any;
            @XmlAttribute
            protected String time;

ネストされたオブジェクトをトップレベルのオブジェクトにキャストしようとしているようです。

09:28:34,608 ERROR [STDERR] java.lang.ClassCastException: uk.co.test.dashboard.dal.Response$Insurer$Subject$CallReport7$CallReport7Response cannot be cast to uk.co.test.dashboard.dal.Response

このコードを使用して非整列化しています:

Response response = new Response();
        StringReader reader = new StringReader(resp);
        try {
            JAXBContext context = JAXBContext.newInstance(response.getClass());
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Object o = unmarshaller.unmarshal(reader);
            response = (Response) o;
        } catch (JAXBException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
4

1 に答える 1

2

スキーマ.xsd

JAXB スキーマ アノテーションを、ネストされたresponse要素から対応する複合型に移動する必要があります。以下は、質問で説明した内容に基づいた単純化された XML スキーマです。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="forum14582017" 
    xmlns="forum14582017" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    elementFormDefault="qualified" 
    jaxb:version="2.1">

    <xs:element name="response">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="callReport7">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="response">
                                <xs:complexType>
                                    <xs:annotation>
                                        <xs:appinfo>
                                            <jaxb:class name="callReport7Response" />
                                        </xs:appinfo>
                                    </xs:annotation>
                                    <xs:complexContent>
                                        <xs:extension base="xs:anyType">
                                            <xs:attribute name="time" type="xs:string" />
                                        </xs:extension>
                                    </xs:complexContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

応答

次のようなクラスが生成されます (スペースを節約するために、コメントとアクセサーは削除されています)。

package forum14582017;

import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"callReport7"})
@XmlRootElement(name = "response")
public class Response {

    @XmlElement(required = true)
    protected Response.CallReport7 callReport7;

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {"response"})
    public static class CallReport7 {

        @XmlElement(required = true)
        protected Response.CallReport7 .CallReport7Response response;

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"any"})
        public static class CallReport7Response {

            @XmlAnyElement
            protected List<Element> any;
            @XmlAttribute(name = "time")
            protected String time;
            @XmlAnyAttribute
            private Map<QName, String> otherAttributes = new HashMap<QName, String>();

        }

    }

}

デモ

上記の XML スキーマから生成された JAXB モデルで以下のデモ コードを使用します。

package forum14582017;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("forum14582017");

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14582017/input.xml");
        Response response = (Response) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(response, System.out);
    }

}

input.xml/出力

次の XML を生成/使用できます。

<?xml version="1.0" encoding="UTF-8"?>
<response xmlns="forum14582017">
    <callReport7>
        <response time="07:47"/>
    </callReport7>
</response>
于 2013-01-30T11:14:48.717 に答える