我有以下课程。编组时,我想省略标签“config”,是否可能?
@XmlRootElement(name = "config")
@XmlAccessorType(XmlAccessType.FIELD)
public static class Config {
@XmlElement(name = "dry-run")
protected Boolean dryRun;
@XmlElementWrapper(name = "filters")
@XmlElement(name = "filter")
protected List<String> filters;
public Boolean isDryRun() {
return dryRun;
}
public void setDryRun(boolean dryRun) {
this.dryRun = dryRun;
}
public List<String> getFilters() {
return filters;
}
}
示例:
当前输出:
<Root>
<config xmlns:wf="nspace">
<dry-run>false</dry-run>
<filters>
<filter>
myFilter
</filter>
</filters>
</config>
</Root>
所需的输出:
<Root>
<dry-run>false</dry-run>
<filters>
<filter>
myFilter
</filter>
</filters>
</Root>
更新
我想知道的是“它是否只能用JAXB完成?”。只需检查一下question (not the answer),我就不知道他是如何只用JAXB编写的,并且没有编写根元素。这正是我想要的。
答案 0 :(得分:0)
因此,您希望将对象编组而不是单个XML子树,而是编组XML片段,即没有父级的兄弟姐妹列表。我相信Jaxb本身无法实现这一目标。但是你可以序列化到一些中间形式并处理它。例如,您可以创建自己的SAX ContentHandler
并使该处理程序计数深度,并且仅在非零嵌套深度处委托事件。
class NoRoot extends XMLFilterImpl {
private int depth;
@Override public void startDocument() throws SAXException
{
depth = 0;
}
@Override public void startElement(String uri, String localName,
String qName, Attributes atts)
throws SAXException
{
if (depth != 0) super.startElement(uri, localName, qName, atts);
++depth;
}
@Override public void endElement(String uri, String localName,
String qName)
throws SAXException
{
--depth;
if (depth != 0) super.endElement(uri, localName, qName);
}
}