7

null如果内部 XML 属性值为空,我如何在解组时检索值?现在我在我的吸气剂中检查null

public String getLabel() {
    if (label.isEmpty()) {
        return null;
    }
    else {
        return label;
    }
}

但是可能存在其他一些更优雅的方式吗?

谢谢。

4

2 回答 2

10

我认为您的 XML 或多或少是这样的:

    <myElement></myElement>

不幸的是,这意味着您传递的是一个空字符串

如果你想通过null,你有两种选择:

  1. 根本不要传递这个标签(你的 XML 根本不应该包含<myElement/>标签)。
  2. 使用xsi:nil.

如果使用xsi:nil,首先您必须将您的 xml 元素(在 XSD 文件中)声明为nilable,如下所示:

    <xsd:element name="myElement" nillable="true"/>

null然后,要在 XML中传递值,请执行以下操作:

    <myElement xsi:nil="true"/>

或这个:

    <myElement xsi:nil="true"></myElement>

这样,JAXB 知道,您传递null的是一个空字符串而不是一个空字符串。

于 2012-06-03T11:15:14.797 回答
7

npe 给出的答案是一个很好的答案,并且指定您希望如何null表示也是我的建议。要进行xsi:nil编组,您需要将您的属性注释为(请参阅绑定到 JSON 和 XML - 处理 Null):

@XmlElement(nillable=true)
public String getLabel() {
    return label;
}

如果您不想更改您的 XML 表示,那么您可以使用XmlAdapter

空字符串适配器

package forum10869748;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class EmptyStringAdapter extends XmlAdapter<String, String> {

    @Override
    public String unmarshal(String v) throws Exception {
        if("".equals(v)) {
            return null;
        }
        return v;
    }

    @Override
    public String marshal(String v) throws Exception {
        return v;
    }

}

XmlAdapter您通过使用@XmlJavaTypeAdapter注释来引用 an 。如果您希望将其XmlAdapter应用于所有字符串,那么您可以在包级别注册它(请参阅JAXB 和包级别 XmlAdapters)。

package forum10869748;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Foo {

    private String label;

    @XmlJavaTypeAdapter(EmptyStringAdapter.class)
    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

}

演示

package forum10869748;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10869748/input.xml");
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        System.out.println(foo.getLabel());
    }

}

输入.xml

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <label></label>
</foo>

输出

null
于 2012-06-04T11:38:18.067 回答