xml - Jaxb:Unmarshaller 找不到具有命名空间和前缀的元素

标签 xml jaxb xml-namespaces unmarshalling moxy

我收到如下所示的 xml:

<result xmlns="firstUri">
    <blackList xmlns:ns1="secondUri">
        <ns2:BlackList xmlns:ns2="thirdUri">
            <name xmlns="thirdUri">some value</name>
            <nameFlag xmlns="thirdUri">some value</nameFlag>
        </ns2:BlackList>
        <ns2:BlackList xmlns:ns2="thirdUri">
            <name xmlns="thirdUri">some value</name>
            <nameFlag xmlns="thirdUri">some value</nameFlag>
        </ns2:BlackList>
             ..........................................................
    </blackList>
    <retCode xmlns:ns1="secondUri">0</retCode>
    <retDesc xmlns:ns1="secondUri">Succeeded</retDesc>
</result>

我想将其解码为反对。

我创建了以下 bean:

@XmlRootElement(name = "result", namespace ="firstUri")
public class GetBlackListResp {
    protected String retCode;
    protected String retDesc;
    protected List<BlackListItem> blackListArray;

    @XmlRootElement(name = "BlackList", namespace = "thirdUri") 
    public static class BlackListItem{
        protected String name;
        protected String nameFlag;

        @XmlElement(name = "name", namespace = "thirdUri")
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }

        @XmlElement(name = "nameFlag", namespace = "thirdUri")
        public String getNameFlag() {
            return nameFlag;
        }
        public void setNameFlag(String nameFlag) {
            this.nameFlag = nameFlag;
        }
}    


    @XmlElement(name = "retCode", namespace = "firstUri")
    public String getRetCode() {
        return retCode;
    }

    public void setRetCode(String retCode) {
        this.retCode = retCode;
    }

    @XmlElement(name = "retDesc", namespace = "firstUri")
    public String getRetDesc() {
        return retDesc;
    }

    public void setRetDesc(String retDesc) {
        this.retDesc = retDesc;
    }

    @XmlElement(name = "blackList", namespace = "firstUri")
    public List<BlackListItem> getBlackList() {
        return blackListArray;
    }

    public void setBlackList(List<BlackListItem> blackListArray) {
        this.blackListArray = blackListArray;
    }
}

解码后我得到了对象,该对象已成功填充,但 blackListArray 字段除外。该字段包含列表,其中只有一项。并且该项目中的所有字段均为空。

看起来 JAXB 可以找到元素,但会错过其中的所有内部元素。

我使用 MOXy 作为 JAXB 实现。

附注

我尝试将 package-info.java 与我的 bean 一起放入文件夹中,如 that question 中所述

@XmlSchema(
    elementFormDefault=XmlNsForm.QUALIFIED,
    namespace="thirdUri",
    xmlns={@XmlNs(prefix="ns2", 
                  namespaceURI="thirdUri")}
)
package package.with.my.bean;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

但这对我没有帮助。

最佳答案

你就快到了。删除内部 BlackListItem 类上的 @XmlRootElement 注解,并将 getBlackList 方法上的注解更改为:

@XmlElementWrapper(name = "blackList", namespace = "firstUri")
@XmlElement(name = "BlackList", namespace = "thirdUri")
public List<BlackListItem> getBlackList() {
    return blackListArray;
}

关于xml - Jaxb:Unmarshaller 找不到具有命名空间和前缀的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21351980/

相关文章:

c++ - 使用 tinyxml2 将文本中的子树插入到现有的 XML 文件中

Java/Xpath——在相似实体中提取特定值

xml - 如何使用 Ant 更新 XML 文档

java - 输出json时可以使用Eclipselink MOXy移动一个元素成为key吗

java - 当你有 xml 命名空间时如何解码?

python - 如何从 lxml 树中剥离 namespace ?

c# - 未为嵌套元素生成 xmlns 属性

java - 哪个 xml validator 将完美地用于多线程项目

java - 从 Java Soap 客户端使用 .NET Web 服务?

java - Chameleon XSD 导入的 JAXB 解决方法?