如果解组,如果XML属性值为空,我如何检索null
值?现在我在getter中查看null
:
public String getLabel() {
if (label.isEmpty()) {
return null;
}
else {
return label;
}
}
但是可能存在一些其他更优雅的方式?
感谢。
答案 0 :(得分:10)
我认为您的XML看起来或多或少是这样的:
<myElement></myElement>
不幸的是,这意味着您传递空字符串。
如果您想通过null
,您有两种选择:
<myElement/>
标记。)xsi:nil
。如果使用xsi:nil
,首先必须将xml元素(在XSD文件中)声明为nilable
,如下所示:
<xsd:element name="myElement" nillable="true"/>
然后,要在XML中传递null
值,请执行以下操作:
<myElement xsi:nil="true"/>
或者这个:
<myElement xsi:nil="true"></myElement>
这样,JAXB知道你传递null
而不是空字符串。
答案 1 :(得分:7)
answer given by npe是一个很好的,并且指定您希望null
代表的方式也是我的建议。要让xsi:nil
编组,您需要注释您的财产(请参阅Binding to JSON & XML - Handling Null):
@XmlElement(nillable=true)
public String getLabel() {
return label;
}
如果您不想更改XML表示,则可以使用XmlAdapter
:
<强> EmptyStringAdapter 强>
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
。如果您希望将此XmlAdapter
应用于所有字符串,则可以在包级别注册它(请参阅JAXB and Package Level 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());
}
}
<强> input.xml中强>
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<label></label>
</foo>
<强>输出强>
null