如何使用 JAXB 创建没有价值的 XmlElement

Posted

技术标签:

【中文标题】如何使用 JAXB 创建没有价值的 XmlElement【英文标题】:How to create XmlElement with no value with JAXB 【发布时间】:2019-08-09 07:50:00 【问题描述】:

想要使用 JAXB 创建以下 XML 元素,没有值(内容),没有关闭元素名称,只是关闭 '/':

 <ElementName attribute1="A" attribute2="B"" xsi:type="type" xmlns="some_namespace"/> 

试试下面的

@XmlAccessorType(XmlAccessType.FIELD)                                  

public class ElementName 
@XmlElement(name = "ElementName", nillable = true)
protected String value;
@XmlAttribute(name = "attribute1")
protected String attribute1;
@XmlAttribute(name = "attribute2")
protected String attribute2;

如下构造该类型对象时,出现异常

ElementName element = new ElementName();

正确的做法是什么?

【问题讨论】:

有什么异常? 【参考方案1】:

如果您想在 value 设置为 null 的情况下为 ElementName 实现它,请删除 nillable 属性。如何生成XML有效载荷的简单示例:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public class JaxbApp 

    public static void main(String[] args) throws Exception 
        JAXBContext jaxbContext = JAXBContext.newInstance(ElementName.class);

        ElementName en = new ElementName();
        en.attribute1 = "A";
        en.attribute2 = "B";
        en.value = null;

        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(en, System.out);
    


@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ElementName")
class ElementName 

    @XmlElement(name = "ElementName")
    protected String value;
    @XmlAttribute(name = "attribute1")
    protected String attribute1;
    @XmlAttribute(name = "attribute2")
    protected String attribute2;

打印:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ElementName attribute1="A" attribute2="B"/>

【讨论】:

感谢工作。另外,我如何定义这个 xmlElement 的类型和命名空间? @uriBaba,添加xmlns="some_namespace" 使用@XmlRootElement namespace 属性。对于xsi:type="type",您应该添加带有@XmlAttribute(name = "xsi:type") 注释的新属性private String type = "type"。我没有测试它,但它应该可以工作。 谢谢。如果我想将此元素添加为子元素,例如 - 如何完成了吗? @uriBaba,您需要创建新类Parent 并包装ElementName。

以上是关于如何使用 JAXB 创建没有价值的 XmlElement的主要内容,如果未能解决你的问题,请参考以下文章

如何克隆JAXB对象

如何从使用 JAXB 的服务返回的“anyType”创建 java 对象?

在将 XML 文件解组为对象后,如何让 JAXB 调用方法?

如何跳过字段并仅使用JAXB解组该字段的特定成员?

JAXB 可以创建“只读”类属性吗?

我可以从类似于 jaxb 的 json 数据创建类吗