[英]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,則可以按如下方式完成:
這不是使 JAXB 忽略名稱空間的問題的通用解決方案,我認為您不會找到一個解決方案(盡管我很高興被比我更了解 JAXB 的人糾正)。
說了以上所有...我認為您可能解決了錯誤的問題。 JAXB 標准基於 XML 模式。 XSD 並不意味着容忍錯誤的命名空間。 因此,第二個 XML 文檔無效,應該由生成它的人進行更正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.