我想解组包含数据集合的xml文件,比如
<Persons>
<Person>Jim</Person>
<Person>Tom</Person>
</Persons>
我们知道这可以通过两个classess完成:人员,使用Castor的人员,JAXB或其他框架。
但是如果不编写集合类Persons怎么办?
答案 0 :(得分:1)
JAXB:
unmarshaller.unmarshal(node, Person.class)
还有一些使用programmaticaly创建映射的高级技术。
答案 1 :(得分:0)
寻找一种方法告诉Castor您希望它生成java.util.List
个人实例。
答案 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;
}
}