null
如果内部 XML 属性值为空,我如何在解组时检索值?现在我在我的吸气剂中检查null
:
public String getLabel() {
if (label.isEmpty()) {
return null;
}
else {
return label;
}
}
但是可能存在其他一些更优雅的方式吗?
谢谢。
我认为您的 XML 或多或少是这样的:
<myElement></myElement>
不幸的是,这意味着您传递的是一个空字符串。
如果你想通过null
,你有两种选择:
<myElement/>
标签)。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
的是一个空字符串而不是一个空字符串。
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