1

以前にマーシャリングした XML をアンマーシャリングしようとしています。

アンマーシャリングされた結果では、要素が欠落しており、取得した要素は入力 XML と同じ順序ではありません。afterUnmarshal() リスナーを作成しましたが、そこに要素が表示されますが、結果の Java オブジェクトには表示されません。

XSD は次のように構成されています (たとえば、「ファンアウト」ノードには別の一連の processSteps を含めることができるため、深くネスト (ツリー) できます)。

<xsd:element name="process">
        <xsd:annotation>
            <xsd:documentation>Integration Process</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
            <xsd:sequence>
        <!-- more -->
                <xsd:element name="itinerary" type="lwis:itineraryType"/>
        <!-- more -->
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="itineraryType">
        <xsd:sequence>
            <xsd:element name="step" type="lwis:stepType"/>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="step" type="lwis:stepType"/>
                <xsd:element name="fanout" type="lwis:fanoutType"/>
                <xsd:element name="decision">
                    <xsd:complexType>
                            <!-- snip.. -->
                    </xsd:complexType>
                </xsd:element>
            </xsd:choice>
        </xsd:sequence>
    </xsd:complexType>

順序は SAX パーサーによって与えられると思いますが、SAX パーサーが理由もなく順序を変更するとは想像できませんか? 現時点では、リストの最初の要素が XML の最後の要素です。リストの 2 番目の要素は XML の 3 番目の要素です - ランダムに見えます..

助けてくれてありがとう!

サンプル入力:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<process name="My.Process" description="My Process description" qualityOfService="AT_LEAST_ONCE" entryEndpoint="ENTRY.EP" xmlns="http://www.xxxxx.com/ns/yyyy">
    <faultEndpoint endpoint_ref="EXIT.EP"/>
    <rejectEndpoint endpoint_ref="EXIT.EP"/>
    <itinerary>
        <step name="Step 1" endpoint_ref="Step1.EP" type="SERVICE"/>
        <step name="Step2-CBRStep" endpoint_ref="Step2.EP" type="SERVICE"/>
        <decision name="Decision-nonameneeded">
            <option name="op1">
                <step name="Step 2A" endpoint_ref="Step2a.EP" type="SERVICE"/>
            </option>
            <option name="op2">
                <step name="Step 2B" endpoint_ref="Step2a.EP" type="SERVICE"/>
            </option>
        </decision>
        <step name="Step 3" endpoint_ref="Step3.EP" type="SERVICE"/>
        <fanout name="Fan1">
            <path>
                <step name="Step4A" endpoint_ref="Step4A.EP" type="SERVICE"/>
            </path>
            <path>
                <step name="Step4B" endpoint_ref="Step4B.EP" type="SERVICE"/>
                <step name="Step5" endpoint_ref="Step5.EP" type="SERVICE"/>
            </path>
        </fanout>
        <step name="Step6" endpoint_ref="Step6.EP" type="SERVICE"/>
    </itinerary>
</process>

物体:

Process Object has a field with itinerary of Type ItineraryType which:
step = StepType ("Step6" from XML)
stepOrFanoutOrDecision = ArrayList:
 item 0: ItineraryType$Decision ("Decision-nonameneeded" from XML)
   option 0: "op1" from XML
     step: "Step 2A" from XML
   option 1: "op2" from XML
     step: "Step 2B" from XML
 item 1: FanoutType ("Fan1" from XML)
     path 0: 
      step: Step4A
     path 1: 
      step: Step5

ステップ 1、ステップ 2-CBRStep およびステップ 4B が欠落していますか?

ここに旅程の toString() 出力があります。

com.x.ItineraryType@fe39ebf[step=com.x.StepType@28cb15bf[endpointRef=Step6.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step6, description=<null>], stepOrFanoutOrDecision={com.x.ItineraryType$Decision@2d00c385[option={com.x.ItineraryType$Decision$Option@d2467d8[step=com.x.StepType@511d9ca5[endpointRef=Step2a.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step 2A, description=<null>], stepOrFanoutOrDecision=<null>, name=op1],com.x.ItineraryType$Decision$Option@6f173e3d[step=com.x.StepType@5ef74fc5[endpointRef=Step2a.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step 2B, description=<null>], stepOrFanoutOrDecision=<null>, name=op2]}, name=Decision-nonameneeded, description=<null>],com.x.FanoutType@3e963f38[path={com.x.FanoutType$Path@7a1095a1[step=com.x.StepType@56cfbba2[endpointRef=Step4A.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step4A, description=<null>], stepOrFanoutOrDecision=<null>, name=<null>],com.x.FanoutType$Path@6027b534[step=com.x.StepType@4ee99a3d[endpointRef=Step5.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step5, description=<null>], stepOrFanoutOrDecision=<null>, name=<null>]}, name=Fan1, description=<null>]}]

私が使用している Ant スクリプト: 拡張子 hashCode、toString、および equals:

<?xml version="1.0" encoding="UTF-8"?>
<project name="RunningXjc" default="generate-sources" basedir=".">
    <description>Runs Xjc Binding Compiler</description>

    <target name="generate-sources">
        <taskdef name="xjc" classname="org.jvnet.jaxb2_commons.xjc.XJC2Task">
            <classpath>
                <fileset dir="buildLib/jaxb-ri-2.2.6/lib">
                    <include name="*" />
                </fileset>
                <fileset dir="buildLib/jaxb2-basics-dist-0.6.4/dist">
                    <include name="jaxb2-basics-ant-*.jar" />
                </fileset>
            </classpath>
        </taskdef>

        <!-- Generate the Java code for XSD -->
        <xjc destdir="${basedir}/target/generated-sources/xjc" extension="true">
            <arg
                line="
        -Xequals
        -XhashCode
        -XtoString
        -Xcopyable
        -Xmergeable" />
            <binding dir="${basedir}/src">
                <include name="**/*.xjb" />
            </binding>
            <schema dir="${basedir}/schema">
                <include name="processSlim.xsd" />
            </schema>
            <!-- Plugins -->
            <classpath>
                <fileset dir="${basedir}/buildLib/jaxb2-basics-dist-0.6.4">
                    <!-- JAXB2 Basics library -->
                    <include name="dist/jaxb2-basics-*.jar" />
                    <!-- JAXB2 Basics library dependencies -->
                    <include name="dist/jaxb2-basics-runtime-*.jar" />
                    <include name="dist/jaxb2-basics-tools-*.jar" />
                    <include name="lib/commons-beanutils-*.jar" />
                    <include name="lib/commons-lang-*.jar" />
                    <include name="lib/commons-logging-*.jar" />
                    <include name="lib/javaparser-*.jar" />
                    <include name="lib/annox-*.jar" />
                </fileset>
            </classpath>
        </xjc>
    </target>
</project>
4

1 に答える 1

1

問題

XML スキーマから

以下は、XML スキーマの一部です。には、choice 構造の内側と外側の両方で要素が発生する可能性がitineraryTypeあるシーケンスが含まれています。step

<xsd:complexType name="itineraryType">
    <xsd:sequence>
        <xsd:element name="step" type="lwis:stepType" />
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="step" type="lwis:stepType" />
            <xsd:element name="fanout" type="lwis:fanoutType" />
            <xsd:element name="decision">
                <xsd:complexType>
                    <!-- snip.. -->
                </xsd:complexType>
            </xsd:element>
        </xsd:choice>
    </xsd:sequence>
</xsd:complexType>

旅程タイプ

これにより、step要素が 2 つの異なるプロパティにマップされ、問題が発生しています。

public class ItineraryType {

    @XmlElement(required = true)
    protected StepType step;
    @XmlElements({
        @XmlElement(name = "step", type = StepType.class),
        @XmlElement(name = "fanout", type = FanoutType.class),
        @XmlElement(name = "decision", type = ItineraryType.Decision.class)
    })
    protected List<Object> stepOrFanoutOrDecision;

   ...
}

解決

JAXB XJC ツールのシンプル バインディング モード拡張を使用して、このユース ケースをサポートできます。stepプロパティが作成されるのを自動的に防ぎます。これは、次のような外部バインディング ドキュメントを介して指定できます。

bindings.xml

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jxb:extensionBindingPrefixes="xjc"
    version="2.1">


    <jxb:globalBindings>
        <xjc:simple />
    </jxb:globalBindings>

</jxb:bindings>

XJCコール

以下は、XJC 呼び出しで外部バインディング ファイルを参照する方法です。-extensionXJC 拡張機能を使用できるようにするには、フラグも使用する必要があります。

xjc -extension -b bindings.xml schema.xsd 
于 2013-03-25T15:25:21.923 に答える