我使用JAXB来创建XML消息。我需要创建的XML(为了简单起见):
<request>
<header/>
</request>
我的代码如下所示:
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "request")
public class Request {
private String header;
@XmlElement(required=true)
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header=header;
}
}
问题:未显示header
元素(标题为null
)。当标头设置为空字符串时,将显示以下内容:
<request>
<header></header>
</request>
当我使用Object
类型代替String
时,结果会更糟:
<request>
<header xsi:type="xs:string"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></header>
</request>
BTW:我正在使用this code来创建XML字符串。
是否可以获得空标签?
答案 0 :(得分:11)
在XML中,<header/>
和<header></header>
是相同的。如果你真的想要前者,那就使用美化剂。 javax.xml.transform.TransformerFactory.newTransformer()
可能会为您做到这一点。
答案 1 :(得分:2)
String对象的空标记本质上是空字符串。
如果您拨打以下电话,您将获得所需内容:
request.setHeader("")
我还应该注意,在XML中,头部的以下两个声明是完美的。这两个都没有子文本节点。这些基本相同,并且所有XML解析器都将对它们进行相同的处理:
<header></header>
<header/>
答案 2 :(得分:2)
@Tom Hawtin - 强调说道
<header/>
和<header></header>
相同。解析器会给你“”。
您必须将nillable
放在标题注释
@XmlElement(nillable=true, required=true)
public String getHeader() {
return header;
}
我希望此代码会为null
值生成以下XML。
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Request {
public static void main(String[] args) throws JAXBException {
final Request request = new Request();
final JAXBContext context = JAXBContext.newInstance(Request.class);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
marshaller.marshal(request, System.out);
System.out.flush();
}
@XmlElement(nillable=true, required=true)
private String header;
}
打印
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request>
<header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</request>
答案 3 :(得分:0)
我想要同样的事情,有效SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
final int searchBarId = searchView.getContext().getResources().getIdentifier("android:id/search_bar", null, null);
LinearLayout searchBar = (LinearLayout) searchView.findViewById(searchBarId);
searchBar.setLayoutTransition(new LayoutTransition());
而不是<header/>
在xml序列化过程中。
由于空值 - 而不是空字符串 - 将产生正确的结果,我修改了我的setter方法,将值显式设置为null:
<header></header>