我想解封一个包含混合内容的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对象中,并分配正确的值。对象变量(文本内容
你可以试试这个:
使用如下引用类,
@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时获得这些值