【发布时间】:2020-05-14 13:20:10
【问题描述】:
我正在编写一个解组器,并且我正在与 jaxb 努力争取找到一个可行的解决方案。
我想解组从 .wsdl 文件生成的 MessageDescription。 wsdl 文件中的 java 类是:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MessageDescription", propOrder = {
"source",
"key",
"data",
"extension"
})
@XmlSeeAlso({
org.onvif.ver10.schema.ConfigDescription.Messages.class
})
public class MessageDescription {
@XmlElement(name = "Source")
protected ItemListDescription source;
@XmlElement(name = "Key")
protected ItemListDescription key;
@XmlElement(name = "Data")
protected ItemListDescription data;
@XmlElement(name = "Extension")
protected MessageDescriptionExtension extension;
@XmlAttribute(name = "IsProperty")
protected Boolean isProperty;
@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap<QName, String>();
// Ommited...
由于没有@XmlRootElement,我用包装器扩展了类并自己添加注释
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement (name = "MessageDescription", namespace = "http://www.onvif.org/ver10/schema")
public class MessageDescriptionXmlWrapper extends MessageDescription {
}
我使用我的“包装器”MessageDescription 类来解组
private static MessageDescription parseMessageDescription(final Node messageDescriptionNode) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(MessageDescriptionXmlWrapper.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
MessageDescription unmarshal = (MessageDescription) unmarshaller.unmarshal(messageDescriptionNode);
return unmarshal;
}
解组过程正在运行,但一个 sub-sub-sub 项始终设置为 null。我不知道在哪里可以解决这个解组错误。
为 null 的属性是 QName 的“类型”。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public static class SimpleItemDescription {
@XmlAttribute(name = "Name", required = true)
protected String name;
@XmlAttribute(name = "Type", required = true)
protected QName type;
我怀疑 QName 不能被反序列化,因为它不是 XML 元素:
->https://docs.oracle.com/javase/7/docs/api/javax/xml/namespace/QName.html
以及SimpleItemDescriptionfull file的原始.xsd描述
<xs:element name="SimpleItemDescription" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Description of a simple item. The type must be of cathegory simpleType (xs:string, xs:integer, xs:float, ...).</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="Name" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>Item name. Must be unique within a list.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Type" type="xs:QName" use="required"/>
</xs:complexType>
</xs:element>
有什么想法吗?
【问题讨论】:
标签: java jaxb unmarshalling