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

使用Jaxb解组MixedContent返回具有空变量的对象

尹俊贤
2023-03-14

我想解封一个包含混合内容的XML文件。我在stackoverflow上发现了一个似乎合适的线程(JAXB-@XmlMixed用于读取@XmlValue和@XmlElement),其中用户bdoughan定义了3个用例来处理混合内容。

第三个用例将标签之间的文本保存在单个 String 变量中,并将元素保存在 List 中。这就是我想要的。不幸的是,我无法让它工作,线程很旧,也许已经过时了。

我已经尝试了用例#3,其中有一个对象列表和一个引用类列表。我还尝试了@XmlElement和@XmlValue注释。

我正在使用javax.xml。绑定版本2.3.1中的jaxb api和org.glassfish。jaxb jaxb运行时,版本2.3.1,在具有JavaSE版本12.0.2的Maven Projec中。

我测试的示例XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Date>
    2018.06.27
    <reference id="AnyId1">
    </reference>
</Date>

我的班级代表

@XmlRootElement(name="Date")
public class TestPojo {

@XmlMixed
public String getTextContent() {
    return textContent;
}

public void setTextContent(String textContent) {
    this.textContent = textContent;
}

@XmlElementRef(name="reference", type = Reference.class)
public List<Object> getRef() {
    return ref;
}

public void setRef(List<Object> ref) {
    this.ref = ref;
}

String textContent;
List<Object> ref = new ArrayList<Object>();

}    

我希望将xml取消编组到POJO对象中,并分配正确的值。对象变量(文本内容

共有1个答案

南门棋
2023-03-14

你可以试试这个:

使用如下引用类,

@XmlAccessorType(XmlAccessType.FIELD)
public class Reference {
    @XmlAttribute
    private String id;
}

和你的根类,

@XmlRootElement(name="Date")
public class TestPojo {

    @XmlMixed
    @XmlAnyElement
    private List<Object> textContent;

    @XmlElement
    private Reference reference;

}

这将为您提供引用元素和列表中的所有其他内容。

对于您的示例,将有2个条目。日期值/文本以及制表符(\t)和换行符(\n),以及另一个带有换行符的条目。

因此,您可以使用此列表来处理内容并使用您想要的内容。

如果有更干净的解决方案,我很感兴趣。干杯

更新对评论的回答:

为了更清楚地修复。我所做的是使用@XmlElement而不是@XmlElementRef单个引用而不是列表(因为我在xml中看到的)。

此外,我还添加了@XmlAnyElement混合内容的注释使其成为一个列表。这就是修复它的原因。因此,坚持使用您的类,它将如下所示:

@XmlRootElement(name="Date")
public class TestPojo {

    List<Object> textContent;
    Reference ref;

    @XmlMixed
    @XmlAnyElement
    public List<Object> getTextContent() {
        return textContent;
    }

    public void setTextContent(List<Object> textContent) {
        this.textContent = textContent;
    }

    @XmlElement(name="reference")
    public Reference getRef() {
        return ref;
    }

    public void setRef(Reference ref) {
        this.ref = ref;
    }

}

@XmlAccessorType节省了我编写getter和setter的时间。要解释此注释在示例中的作用(以及与<code>@XmlElement

 类似资料:
  • 当在testng单元testcase中运行时,JAXB将XML文件解组到对象中工作正常。 当相同的代码被用来在另一个进程中解封相同的XML文件时,我得到了一个空对象。我可以验证对象是为XML文档中的每个元素创建的,并且所有适配器都被调用。在unmarshaller中设置事件处理程序,但没有验证问题。当我设置xmlns属性和前缀时,即使返回空对象,行为也略有不同。 我看了好几篇文章,但都无法与我面临

  • 在解组xml文档时,JAXB无法解组具有替换组名称的复杂类型。doucment带有替换名,JAXB解组进程无法将数据与实际元素绑定。最后,我得到一个空对象,它的数据到达xml文档中。这是JAXB中的错误还是我在这里做错了什么? 注意:下面的模式清楚地定义了有问题的复杂元素类型ENBFunction的替代名称。并且在解编组"xn: ManagedElementOptionallyContainedN

  • 我有下面的,我试图使用JAXB将其转换为Java对象。我在这里得到空值,请指导我这里缺少什么或做错了什么。 我不熟悉 JAXB 和命名空间

  • 问题内容: 我正在尝试从Convio的公共api解组一个简单的xml文档。我的以下代码未出现任何编译器错误,但也不会产生结果。该值为空。如果我从xml文档中删除模式和名称空间项,并从POJO中删除名称空间属性,那么它将运行良好。我缺少能够使用xsd文档/名称空间的东西吗? 我试图解析的XML示例 以及带有注释的POJO: 现在,我正在使用Jersey来完成实际工作,但是由于无法使用Jersey使它

  • 我从 3 个不同的客户端收到 3 个不同的 xml 输入: 来自客户端1的输入1:(命名空间前缀:,命名空间url:) 来自客户端 2 的输入 2:(命名空间前缀:,命名空间 URL:) 从客户端3输入3:(名称空间前缀: 时,< li >调用< code>String.replace() 这让我想到这种变量命名空间的方法是否应该完全可以接受。如果有什么可以改进此代码的方法,那么我要求社区在答案/

  • 嗨,我想使用maven依赖项使用un-marshaling来获取嵌套xml的值,但最终的输出是返回给我空值。我使用了maven项目中的3个包和vehicle.xml包含了car的值,在获取这些值后,我必须将它们插入到access数据库中 我想在最终输出返回null时获得这些值