jaxb抑制嵌套对象的外部标签

2024-03-25

我有一个复杂的对象,作为通常的“我无法控制的 API”的返回值返回。

对于某些 API 调用,返回的 XML 如下所示:

<APICall1>
  <VeryComplexObject>
    <VeryComplexObjectElements... >
  </VeryComplexObject>
</APICall1>

没问题,我只是用

@XmlElement
private VeryComplexObject VeryComplexObject;

一切如常。

但有几个调用想要返回:

<APICall2>
    <VeryComplexObjectElements... >
</APICall2>

有没有我可以用来抑制的注释<VeryComplexObject>用于解组的标签但获取内部元素标签?


您可以将 JAXB 与 StAX 结合使用,通过利用StreamFilter忽略 XML 元素:

package forum8526002;

import java.io.StringReader;

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        StringReader xml = new StringReader("<APICall2><VeryComplexObjectElements><Bar>Hello World</Bar></VeryComplexObjectElements></APICall2>");
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);
        xsr = xif.createFilteredReader(xsr, new Filter());

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Foo foo = (Foo) unmarshaller.unmarshal(xsr);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(foo, System.out);
    }

    @XmlRootElement(name="APICall2")
    static class Foo {

        @XmlElement(name="Bar")
        private String bar;

    }

    static class Filter implements StreamFilter {

        @Override
        public boolean accept(XMLStreamReader reader) {
            return !(reader.isStartElement() && reader.getLocalName().equals("VeryComplexObjectElements"));
        }

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jaxb抑制嵌套对象的外部标签 的相关文章

随机推荐