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

JAXB如何解编组命名空间?

谷梁迪
2023-03-14
<A xmlns="something">
   <B>4</B>
</A>

我的代码如下:

@XmlRootElement(name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{

@XmlElement(name = "B")
private String b;

public Data(String b) {
    this.b = b;
}

public Data() {
}
// Getter/setter generated by lombok.
}

我怎样才能让它工作?如果我的xml标记有一些相关元素,如上面的“xmlns”,则JAXB解组器会抛出异常。

这是我第一次这么做,所以我对JAXB、解编等都一无所知。我在苦苦挣扎任何帮助都是好的。

编辑StackTrace:

javax.xml.bind.UnmarshalException: unexpected element (uri:"something", local:"A"). Expected elements are <{}B>,<{}A>
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1131)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:556)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at   com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
at ...

共有3个答案

简成仁
2023-03-14

所有您需要的是添加一个@XmlAt0016到A(alogn与相应的getter/setter)

@XmlRootElement(name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{

@XmlAttribute(name="xmln")
String attr;
@XmlElement(name = "B")
private String b;

public Data(String b) {
    this.b = b;
}

   public Data() {
 }
// Getter/setter generated by lombok.
    public String getAttr(){
    return attr;
    }
    public void setAttr(String attr){
    this.attr = attr;
  }
  }

编辑:这并不能回答问题,因为问题是关于xml名称空间而不是属性的。

姬飞昂
2023-03-14

如果xml文档中有名称空间,那么jaxb注释中也需要有名称空间。

例如像这样:

@XmlRootElement(name = "A", namespace="something")
@XmlAccessorType (XmlAccessType.FIELD)
public class Data{
臧令
2023-03-14

XmlRootElement的来源:

public @interface XmlRootElement {
    /**
     * namespace name of the XML element.
     * <p>
     * If the value is "##default", then the XML namespace name is derived
     * from the package of the class ( {@link XmlSchema} ). If the
     * package is unnamed, then the XML namespace is the default empty
     * namespace.
     */
    String namespace() default "##default";
     // else of file

您还应该记住,这条规则也适用于大多数JAXB注释,所以您需要指定根元素和其他明确给出命名空间的元素,比如:

@XmlRootElement(namespace="something", name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
    @XmlElement(namespace="something", name = "B") // <-- mind this
    private String b;

    public Data(String b) {
        this.b = b;
    }

    public Data() {
    }
    // Getter/setter generated by lombok.
}

如果你不这样做,它会期望,假设你的Dataorg.example包中,命名空间org.example中的一些元素,只要你有@XmlSchema(elementFormDefault=QUALIFIED),否则它将期望默认命名空间中的元素。

 类似资料:
  • 我有一个为安全令牌构建的XML。这些包含基于WS-Trust的名称空间,但是当我解组这个XML以创建< code > RequestSecurityTokenResponseCollection 对象时,它用< code>ns1 、< code>ns2 、< code>ns3等名称空间替换了这些名称空间。 是否有一种方法可以在不更改输入XML中的名称空间和名称空间前缀的情况下解组XML? 这是我一

  • 当我试图使用包含名称空间的JAXB将xml转换为Java对象时,会发生错误。 示例示例:' Zeta Walnes ` 我需要忽略名称空间

  • 在JAXB将xml文件解组以请求对象并将其发送给servis时,我遇到了一些问题。 它返回错误而不是正确的响应-。 我正在使用下一个模式: 带有测试日期的xml文件= 以下是源xml文件: 我使用JAXB解析并转换到我的RQ对象。 它返回奇怪的错误而不是响应。 我只是将未解析的请求写入xml文件: 它有很多讨厌的ns1:nameprefix。 我想知道如何在没有冗余前缀的情况下解组?

  • 这是我的xml,需要把它转换成Java。我使用了jaxb 并抛出以下异常javax.xml.bind.unmarshalException:意外元素(URI:“http://www.ae.com/event/load”,local:“order”)。需要的元素为<{}LM:order>

  • 我有几个关于JAXB编组的简单问题。我正在尝试封送包含以下字段的类: 只需使用以下序列化代码: 我得到的输出是: 现在,我面临的问题如下: > 我想要名称空间xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“出现在根元素中,即TokenRestrictionTemplate中,而不是单个子元素中。如何实现这一点? 我有一些元素,例如带有@Xm

  • 首先,我使用Camel 2.15版(在Fuse 6.2.1中)创建了一些路由。 在我的过程中,我试图从使用cxf xjc maven插件生成的pojo中创建一个XML(cxf xjc从xsd的某个地方读取了一些xsd,然后生成了带有jaxb注释的pojo)。 pojos是TempProject和TempProjects。 我可以使用以下代码生成xml: 我打电话 在我实现从pojo到xml的编组的