簡體   English   中英

如果未設置命名空間前綴,則解組對象為 null

[英]Unmarshalled object is null if namespace prefix is not set

我有以下 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:x="MY_NAMESPACE"
           targetNamespace="MY_NAMESPACE">

    <xs:element name="response" type="x:responseType"/>

    <xs:complexType name="responseType">
        <xs:all>
            <xs:element name="param" type="x:responseParam"/>
        </xs:all>
    </xs:complexType>

    <xs:complexType name="responseParam">
        <xs:all>
            <xs:element name="value" type="xs:string"/>
        </xs:all>
    </xs:complexType>

</xs:schema>

我用它來生成 JAXB 類來解組如下所示的有效負載:

<x:response xmlns:x="MY_NAMESPACE">
<param>
<value>OK</value>
</param>
</x:response>

通過getWebServiceTemplate().marshalSendAndReceive在 Spring 中。 問題是,我還想解組沒有命名空間前綴的有效負載,如下所示:

<response xmlns="MY_NAMESPACE">
<param>
<value>OK</value>
</param>
</response>

在這種情況下, response標記被正確解析,但表示param的對象引用始終為空。 如何編輯我的 XSD 以使其正常工作? 我已經嘗試在架構中設置elementFormDefault="qualified" ,甚至在param元素上設置form="qualified"

想到的其他信息(我可能會根據評論編輯和添加更多信息):

  • 解組器是一個Jaxb2Marshaller

XML 文檔

我想您可能知道這一點,但是刪除該命名空間前綴會影響整個文檔(因為 'param' 和 'value' 標簽沒有任何前綴,因此繼承了默認的命名空間綁定)。 因此,在第一個文檔中,根標簽“response”位於名稱空間“MY_NAMESPACE”中,其他標簽沒有任何名稱空間。 在第二個文檔中,所有標簽都在命名空間“MY_NAMESPACE”中。

XML 架構

elementFormDefault 屬性默認為“unqualified”,因此您的架構應該匹配第一個文檔並拒絕第二個文檔。 你的實驗證實了這一點。 如果您將 elementFormDefault 設置為 'qualified',那么它將拒絕第一個文檔並匹配第二個文檔。 elementFormDefault 沒有值可以使 XSD 匹配兩個 XML 文檔。 命名空間是元素身份的一個組成部分。

可能的解決方案

如果您決定構建一個匹配兩個文檔的 XSD,則可以按如下方式完成:

  • 將 elementFormDefault 顯式設置為“不合格”(可選,但您將依賴該設置)b
  • 將 responseType 的當前(全局聲明)內容包裝在一個選擇組中
  • 在包含元素“param”及其所有后代的本地聲明的選擇組中添加第二個分支。 因為這些是本地聲明的,所以它們將在 noTargetNamespace 中。

這不是使 JAXB 忽略名稱空間的問題的通用解決方案,我認為您不會找到一個解決方案(盡管我很高興被比我更了解 JAXB 的人糾正)。

說了以上所有...我認為您可能解決了錯誤的問題。 JAXB 標准基於 XML 模式。 XSD 並不意味着容忍錯誤的命名空間。 因此,第二個 XML 文檔無效,應該由生成它的人進行更正。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM