当前位置: 首页 > 知识库问答 >
问题:

解组子元素上的jaxb失败(QName)

皇甫琛
2023-03-14

我正在编写一个解组器,我正在努力与jaxb进行斗争,以获得一个有效的解决方案。

我想解组从生成的MessageDescription。wsdl文件。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;
}

解组过程正在工作,但有一个子项始终设置为null。我不知道在哪里可以修复这个解组错误。

空属性是作为QName的“type”。

@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元素:

-

还有原件。SimpleItemDescription完整文件的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>

任何想法?

共有1个答案

竺勇
2023-03-14

尝试添加包信息。java文件

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.onvif.org/ver10/schema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package your.package.name;

放入MessageDescriptionXmlWrapper所在的同一文件夹中

 类似资料:
  • 我正在尝试使用JAXB以以下格式散集XML: 我想从user元素开始解组XML。但是,当我尝试使用“@XmlRootElement(name=“user”)”时,我收到以下错误: 这是我的帐户模型类: 服务:

  • 背景: 我使用JAXB将XML解组为Java对象。最初,我只是使用JAXB来执行解组。然后对代码进行静态分析,并提出了XML外部实体注入的高关键性问题。经过一点研究,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析

  • 为什么在使用JAXB时需要使用? 我的工作场景是这样的: 我正在做一个从.NET到Java的转换项目。在.NET中,类的编写与POJO类似。我只是在代码中添加了注释(如、等)。并解决了与注释相关的错误。 现在我犯了这样的错误: XML文件如下: POJO类:

  • 我正在用JAXB在列表中解组元素序列,见下文。 XML文件 Java-代码 但是,我有点担心textPoint元素的固有顺序,因为它们在XML文件中的顺序很好,但是没有元素(例如ID),我可以通过对它们进行排序。尽管如此,它似乎可以按照与XML文件相同的顺序对它们进行解组,因此不必担心这一点吗?

  • 我尝试解组一个XML文件到一个对象。 我得到了这个错误: 我的解组过程如下所示: 我的XML实体看起来像: 我的XMLFile看起来像: 那么,我的解组过程出了什么问题?XML实体是用xjc创建的。 我也尝试了简单的xml文件/对象。这对我来说很好。

  • 你好,我正在使用JAXB将XML解锁到JAVA,我的xml文档中有一个元素“值”,可以是int类型,也可以是双精度型,并且我的java类中此元素的相应属性是数字类型的“值”。 JAXB不支持“数字”类型的umarshaling,我想,有人知道如何处理这个问题吗?一个例子将会得到真正的赞赏。提前谢谢。