如何在不映射根xml元素的情况下解组xml?

时间:2011-06-20 09:35:35

标签: java xml jaxb

我想解组包含数据集合的xml文件,比如

 <Persons>
      <Person>Jim</Person>
      <Person>Tom</Person>  
  </Persons>

我们知道这可以通过两个classess完成:人员,使用Castor的人员,JAXB或其他框架。

但是如果不编写集合类Persons怎么办?

3 个答案:

答案 0 :(得分:1)

JAXB:

  • 迭代传入XML的子元素(DOM,SAX,StAX - 无论您最适合的API)
  • unmarshaller.unmarshal(node, Person.class)

还有一些使用programmaticaly创建映射的高级技术。

答案 1 :(得分:0)

寻找一种方法告诉Castor您希望它生成java.util.List个人实例。

http://www.castor.org/how-to-map-a-list-at-root.html

答案 2 :(得分:0)

您可以使用StAX解析器,并使用任何JAXB实现(Metro,EclipseLink MOXy,Apache JaxMe等)执行以下操作:

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();

        FileInputStream xml = new FileInputStream("input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);
        xsr.nextTag(); // Advance to "Persons" tag 
        xsr.nextTag(); // Advance to "Person" tag

        JAXBContext jc = JAXBContext.newInstance(Person.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        List<Person> persons = new ArrayList<Person>();
        while(xsr.hasNext() && xsr.isStartElement()) {
            Person person = (Person) unmarshaller.unmarshal(xsr);
            persons.add(person);
            xsr.nextTag();
        }

        for(Person person : persons) {
            System.out.println(person.getName());
        }
    }

}

<强> input.xml中

<Persons>
    <Person>Jim</Person>
    <Person>Tom</Person>  
</Persons>

系统输出

Jim
Tom

<强>人

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name="Person")
public class Person {

    private String name;

    @XmlValue
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}