問題描述
我得到了這個 XML 結構:
<Tax>
<Money currency="USD">0.00</Money>
<Description xml:lang="en">
17.5% Non-Recoverable
<ShortName>vatspecial</ShortName>
</Description>
</Tax>
注意 Description
節點有 MixedContent
(由文本和 XML 組成) 這是 XSD
部分關于 Description
節點:
Notice that Description
node has MixedContent
(composed with text and XML) and this is the XSD
part regarding Description
node:
<xsd:complexType name="TaxDescriptionType">
<xsd:sequence>
<xsd:element name="ShortName" type="xsd:string" />
</xsd:sequence>
<xsd:attribute ref="xml:lang" />
</xsd:complexType>
此時一切正常,XJC
輸出與 TaxDescriptionType
類似的生成類:
Everything is ok at this point, XJC
outputs the generated classes like this one regarding TaxDescriptionType
:
package org.com.project;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/**
* <p>Java class for TaxDescriptionType complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="TaxDescriptionType">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string"/>
* </sequence>
* <attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TaxDescriptionType", propOrder = {
"shortName"
})
public class TaxDescriptionType {
@XmlElement(name = "ShortName", required = true)
protected String shortName;
@XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String lang;
/**
* Gets the value of the shortName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getShortName() {
return shortName;
}
/**
* Sets the value of the shortName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setShortName(String value) {
this.shortName = value;
}
/**
* Gets the value of the lang property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLang() {
return lang;
}
/**
* Sets the value of the lang property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLang(String value) {
this.lang = value;
}
}
然后,通過上面的 class
我可以使用以下元素:
Then, with the above class
I am able to work around with the elements like this:
taxDescriptionType.setLang("en");
taxDescriptionType.setShortName("vatspecial");
/* missing value: 17.5% Non-Recoverable */
但問題是我找不到 get
或 set
17.5% Non-Recoverable
文本的方法來自上述 XML
示例的 MixedContent-ComplexType
.
But the problem is that I can't found a way to get
or set
the 17.5% Non-Recoverable
text of the MixedContent-ComplexType
from the above XML
example.
這是我嘗試過的,但它不起作用:
- 像這樣使用
mixed="true"
屬性:
<xsd:complexType name="TaxDescriptionType" mixed="true">
(我認為XJC忽略了最后一個屬性)
做了一些研究,我發現了這個:
JAXB XJC 編譯器忽略 XML 上的混合 = true架構文檔
但我不確定這是否是解決此問題的方法.其中一個答案說這是一個錯誤,而另一個答案顯示了將 MixedContent
轉換為 List
But I am not sure if this is the way to solve this. One of the answers said that this is a bug and in the other one shows a code that transforms the MixedContent
into a List<Serializable>
and maybe the next situation will be about how to deal with this:
taxDescriptionType.getContent().add(Serializable element);
(而且我真的不知道如何處理 Serializable
元素)
推薦答案
正如你提到的,你需要添加 mixed
屬性來表明你的類型支持混合內容.如果沒有指定,您的 XML 內容無效:
As you mentioned you need to add the mixed
attribute to indicate that your type supports mixed content. Without this specified your XML content is invalid:
<xsd:complexType name="TaxDescriptionType" mixed="true">
<xsd:sequence>
<xsd:element name="ShortName" type="xsd:string" />
</xsd:sequence>
<xsd:attribute ref="xml:lang" />
</xsd:complexType>
生成的 TaxDescriptionType
類將具有以下屬性.本質上,這意味著所有非屬性內容都將存儲在 List
中.這是必要的,因為您需要一種機制來指示文本節點在元素內容中的位置.
The generated TaxDescriptionType
class will have the following property. Essentially this means that all of the non-attribute content will be stored in a List
. This is necessary because you need a mechanism that indicates where the text nodes are wrt the element content.
@XmlElementRef(name = "ShortName", namespace = "http://www.example.org/schema", type = JAXBElement.class)
@XmlMixed
protected List<Serializable> content;
您將使用 String
(表示文本節點)和 JAXBElement
(表示元素內容)的實例填充此列表.
You will populate this list with instances of String
(representing text nodes) and JAXBElement
(representing element content).
交替
混合內容通常會使生活變得比實際需要的更加復雜.如果可能的話,我會推薦一個替代的 XML 表示.
Mixed content generally makes life more complicated than it needs to be. If possible I would recommend an alternate XML representation.
<Tax>
<Money currency="USD">0.00</Money>
<Description xml:lang="en" ShortName="vatspecial">
17.5% Non-Recoverable
</Description>
</Tax>
或者
<Tax>
<Money currency="USD">0.00</Money>
<Description xml:lang="en">
<LongName>17.5% Non-Recoverable</LongName>
<ShortName>vatspecial</ShortName>
</Description>
</Tax>
這篇關于如何處理帶有 MixedContent 數據的 JAXB ComplexType?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!