如何处理带有 MixedContent 数据的 JAXB ComplexType?
我得到了这个 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>
相关文章