JaxB编组到子命名空间?

时间:2015-03-18 18:05:44

标签: java xml namespaces jaxb

我目前正在尝试将一个对象编组到xml中,但是在编组时,名称空间的结尾太过分了,我似乎无法找出原因。

以下是在valu.xsd:

中引用ValuationDetails的ValuationIn
    <xs:complexType name="ValuationIn">
        <xs:sequence>
            <xs:element xmlns:q1="httpAddress/common" minOccurs="0" name="ValuationIdentifier" nillable="true" type="q1:ValuationIdentifier">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element xmlns:q2="httpAddress/common" minOccurs="0" name="ValuationDetails" nillable="true" type="q2:ValuationDetails">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

,这是公共模式中的ValuationDetails元素:

    <xs:element name="ValuationDetails" nillable="true" type="tns:ValuationDetails"/>
    <xs:complexType name="Policy">
        <xs:sequence>
            <xs:element minOccurs="0" name="PolicyEffectiveDate" nillable="true" type="xs:dateTime">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element minOccurs="0" name="PolicyRenewalDate" nillable="true" type="xs:dateTime">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element minOccurs="0" name="EstimateExpirationDate" nillable="true" type="xs:dateTime">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element minOccurs="0" name="CurrentCoverage" nillable="true" type="xs:int">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element minOccurs="0" name="AccountNumber" nillable="true" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element minOccurs="0" name="AttachmentCount" type="xs:int"/>
            <xs:element minOccurs="0" name="RecordType" nillable="true" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
            <xs:element minOccurs="0" name="DataSource" nillable="true" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
                    </xs:appinfo>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Policy" nillable="true" type="tns:Policy"/>

这是valuService模式中的元素:

<xs:element name="GetFastTrackURL">
    <xs:complexType>
        <xs:sequence>
            <xs:element xmlns:q35="httpAddress/valuation"
                minOccurs="0" name="FastTrackRequest" nillable="true"
                type="q35:FastTrackRequest" />
            <xs:element xmlns:q36="httpAddress/valuation"
                minOccurs="0" name="Valuation" nillable="true" type="q36:ValuationIn" />
            <xs:element xmlns:q37="httpAddress/valuation"
                minOccurs="0" name="SupplementalDataRequest" nillable="true"
                type="q37:SupplementalDataRequest" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

当我将其分解并将其与我们在项目中使用的工作硬编码XML进行比较时,我可以看到命名空间已关闭。比较xml的一小部分,显示顶部的硬编码和底部的生成。

硬编码:

<val:Valuation>
    <val1:ValuationDetails>
        <com:PropertyAddress>
            <com:Address1>Address</com:Address1>
            <com:City>City</com:City>
            <com:StateProvince>MI</com:StateProvince>
            <com:ZipPostalCode>Zip</com:ZipPostalCode>
        </com:PropertyAddress>
        <com:Building>
            <com:MainHome>
                <com:YearBuilt>1979</com:YearBuilt>
                <com:LivingArea>2000</com:LivingArea>
            </com:MainHome>
        </com:Building>
    </val1:ValuationDetails>
</val:Valuation>

生成:

<val1:ValuationIn>
    <com:ValuationDetails>
        <com:PropertyAddress>
            <com:Address1>Address</com:Address1>
            <com:City>City</com:City>
            <com:StateProvince>MI</com:StateProvince>
            <com:ZipPostalCode>Zip</com:ZipPostalCode>
        </com:PropertyAddress>
        <com:Building>
            <com:MainHome>
                <com:YearBuilt>1979</com:YearBuilt>
                <com:LivingArea>2000</com:LivingArea>
            </com:MainHome>
        </com:Building>
    </com:ValuationDetails>
</val1:ValuationIn>

我包含的XML的子部分是模式中的q36,它们在硬编码vs生成中引用的命名空间是在硬编码的xml中xmlns = valuationService,而在生成的xmlns = valu中(评估和评估服务是两种不同的模式。)

以下是ValuationService.xsd顶部的导入:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="httpAddress/valuationservice">
    <xs:import namespace="httpAddress/valuation" schemaLocation="valuation.xsd" />
    <xs:import namespace="httpAddress/common" schemaLocation="common.xsd"/>

我知道写一些可能相当简单的东西是很多的,但我不能为我的生活找出为什么我的编组xml引用的命名空间不同于主要的命名空间架构。

1 个答案:

答案 0 :(得分:0)

没有看到jaxb bean,我只能猜测。 但, 在您的xsd架构中,valuinfo位于httpAddress / common命名空间中,因此生成的xml似乎与您的架构匹配(假设com前缀已解析为httpAddress / common),因此您的硬编码的xml是“错误的”。

通常,ValuationDetail类的名称空间可以在该类的XMLRoot或XMLType注释中声明,也可以在包含Valuation对象的XMLElement上声明。

但是你的xsd架构中似乎有错误用于生成bean,因为它与你的'hardcoded'xml不匹配。