java - JAXB Marshal 缺少属性/元素

标签 java xml jaxb marshalling

我有以下 JAXB 对象:

@XmlRootElement(name = "AuthEntry")
@XmlAccessorType(XmlAccessType.FIELD)
public class AuthEntry {

    @XmlElement(name = "Account")
    private Account account;

    @XmlElement(name = "Key", required = true)
    private String key;

    @XmlElement(name = "Expire", required = true)
    private Date expire;

    // Getter & Setter
    // ...

我使用 JAXB Marshaller 将对象转换为 XML:

public static <T> String marshalObject(T pObject) throws JAXBException, IOException {
    JAXBContext context = JAXBContext.newInstance(pObject.getClass());

    Marshaller m = context.createMarshaller();

    try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
        m.marshal(pObject, stream);
        stream.flush();

        return new String(stream.toByteArray());
    }
}

运行很顺利,没有任何异常,但是结果总是缺少元素Key。我试图将其更改为 Attribute,但它也不起作用。这是一个示例输出:

<AuthEntry xmlns:ns2="urn:schemas-microsoft-com:sql:SqlRowSet3">
    <Account ID="1" Username="datvm" Password="datvm" FullName="NullPtrExc" Active="true"/>
    <Expire>2014-06-06T20:07:32.428+07:00</Expire>
</AuthEntry>

我已尝试将 Key 名称更改为另一个名称,例如 AuthKey,但它仍然丢失。我做错了什么?

编辑 我发现了问题,这是因为我的Key 值为null。如果它包含值,则将其写入 XML。但是,您能解释一下为什么在XMLElement 中,我写了required = true,但是当它为null 时它仍然不存在吗?

最佳答案

JAXB & null

默认情况下,JAXB 实现不会为 null 值编码属性或元素。您可以使用以下命令让 JAXB 生成包含 xsi:nil="true" 属性的元素:

@XmlElement(nillable=true)

空元素

空元素不是 null 的有效表示。例如,如果您的元素是 xs:dateTime 类型并且对应的元素为空,则该文档不会根据 XML 架构进行验证。

关于java - JAXB Marshal 缺少属性/元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24079296/

相关文章:

xml - 从没有属性的XML文档中选择所有元素

xml - 如何在 XSLT 中包装文本以适应窗口

java - 使用 java 将每个元素存储在单独的文本文件中

java - 无法将类型编码为 XML 元素,因为缺少 @XmlRootElement 注释

java - JML 评估\old(表达式[Id])

java - Selenium Webdriver java : click on a checkbox

java - 带有未知@XmlRootElement 的 Jaxb Unmarshall

java - 从流中过滤/删除无效的 xml 字符

java - JLabel 没有去我想要它去的地方

java - 如何在向模型添加行时更改 JTable 行背景颜色?