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 に答える