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

Jaxb:Unmarshaller无法找到具有命名空间和前缀的元素

裴心思
2023-03-14

我收到看起来像这样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实现。

附言

我试着把包裹信息放进去。java与我的bean在文件夹中,如该问题所示

@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;

但这对我没有帮助。

共有1个答案

梁盛
2023-03-14

你就快到了。移除内部< code>BlackListItem类上的< code>@XmlRootElement批注,并将< code>getBlackList方法上的批注更改为:

@XmlElementWrapper(name = "blackList", namespace = "firstUri")
@XmlElement(name = "BlackList", namespace = "thirdUri")
public List<BlackListItem> getBlackList() {
    return blackListArray;
}
 类似资料:
  • 我正在尝试使用 JAXB 创建站点地图索引文件。按照创建站点地图的要求,我必须在根元素中添加命名空间属性: 我想有一个简单的方法来解决这个问题。因为这似乎是一个标准过程,所以我不想做复杂的解决方法,也不想在我的项目中添加更多的依赖项来解决这个问题 当前输出如下: 我的< code>SitemapIndex模型如下: 我还尝试手动添加名称空间字段,它可以生成文件,但是当我尝试读取文件时会出现异常。

  • jaxb 将所有标签分组为一个,我需要每个标签都有自己的命名空间。 具有: 需要: 将命名空间添加到@XmlElement没有帮助 包装信息:

  • 我对XML文件进行数字签名,但需要签名标记包含名称空间前缀“ds”。我在谷歌上搜索了一下,发现了很多同样的问题,但没有令人满意的答案。 我尝试将“ds”手动放入文件中,但签名变得无效。标记“SignatureValue”对标记“SignedInfo”进行签名,因此签名无效。 谁能告诉我如何生成标记“signaturevalue”的值,以便在添加前缀“ds”后替换签名?

  • 我有一个有趣的情况,我的XML编辑器(Oxygen,使用Xerces XML处理器)需要根标签上的前缀,但是我的JAXB XML Marshaller(也是基于Xerces的)不需要根标签上的前缀。我正在试图理解这种情况。 首先是2个模式文件: ns1.xsd ns2。xsd 目前的氧气释放(16.1)需要我称之为“版本1”的东西 版本1 如果我像下面的示例(版本1)那样删除前缀: 版本2 氧气抱

  • 我无法使用下面的XSD验证XML, XSD数据 我在用XML验证这个XSD时遇到以下错误, cvc复合型。2.4.答:发现以元素“standardHeader”开头的内容无效。应为“{standardHeader}”之一。 如何提供此标签:

  • 在LinearLayout中的“xmlns:android=”http://schemas.android.com/apk/res/Android“中出现错误”为标记LinearLayout找到意外的名称空间前缀“xmlns”。