代码之家  ›  专栏  ›  技术社区  ›  nkare

JAXB不想要包装类

  •  1
  • nkare  · 技术社区  · 13 年前

    以下是我必须使用的xml:

    <watermarks identifier="X" hostname="X">
       <watermark type="XX" value="1234"/>
       <watermark type="YY" value="1234" />
    </watermarks>
    

    我只想在不创建新的Watermarks类的情况下使用JAXB获得水印对象的列表。是否可能或应该创建一个包含水印对象列表的水印类?

    谢谢

    1 回复  |  直到 13 年前
        1
  •  0
  •   Community Mohan Dere    9 年前

    你可以使用 StAX (JSR-173) XMLStreamReader 以解析XML文档(自Java SE 6以来,JDK/JJRE中包含了一个实现)。然后你可以把它推进到每一个 watermark 元素,然后具有 JAXB (JSR-222) 把它拆开。

    演示

    假设 Watermark 类的注释为 @XmlRootElement 你可以做以下事情。

    import javax.xml.bind.*;
    import javax.xml.stream.*;
    import javax.xml.transform.stream.StreamSource;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Watermark.class);
            Unmarshaller unmarshaller = jc.createUnmarshaller();
    
            StreamSource source = new StreamSource("input.xml");
            XMLInputFactory xif = XMLInputFactory.newFactory();
            XMLStreamReader xsr = xif.createXMLStreamReader(source);
            xsr.nextTag(); // Advance to "watermarks" element
            xsr.nextTag(); // Advance to "watermark" element
    
            while(xsr.getLocalName().equals("watermark")) {
                 Watermark object = (Watermark) unmarshaller.unmarshal(xsr);
                 System.out.println(object);
                 xsr.nextTag();
            }
        }
    
    }
    

    完整示例

    泛型列表包装类

    在我对下面问题的回答中,我提供了一个泛型列表包装类的示例,您可能会发现它很有用。