你可以在没有父标签的情况下编组一个对象吗?

时间:2013-02-06 10:45:27

标签: java jaxb

我有以下课程。编组时,我想省略标签“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编写的,并且没有编写根元素。这正是我想要的。

1 个答案:

答案 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);
  }

}