3

我有以下课程。编组时,我想省略标签“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 来完成?”。只需检查这个问题(不是答案),我不明白他是如何仅使用 JAXB 进行编组且未编写根元素的。这正是我想要的。

4

1 回答 1

0

因此,您不想将对象编组到单个 XML 子树,而是编组到 XML 片段,即没有父级的兄弟姐妹列表。我相信 Jaxb 本身无法实现这一点。但是您可以序列化为某种中间形式并对其进行处理。例如,您可以创建自己的 SAXContentHandler并拥有该处理程序计数深度,并且仅在非零嵌套深度处委托事件。

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

}
于 2013-02-06T13:46:06.410 回答