Как демонтировать xml без сопоставления корневого элемента xml? - PullRequest
1 голос
/ 20 июня 2011

Я хочу разархивировать XML-файл, содержащий коллекцию данных, например,

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

Мы знаем, что это можно сделать с двумя классами: Persons, Person, использующий Castor, JAXB или другие фреймворки.

Но как обойтись без написания коллекции классов Persons?

Ответы [ 3 ]

1 голос
/ 20 июня 2011

JAXB:

  • Перебирать подэлементы входящего XML (DOM, SAX, StAX - какой API вам больше подходит)
  • unmarshaller.unmarshal(node, Person.class)

Существуют также передовые методы с программно созданными сопоставлениями.

0 голосов
/ 20 июня 2011

Вы можете использовать синтаксический анализатор 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;
    }

}
0 голосов
/ 20 июня 2011

Найдите способ сообщить Castor, что вы хотите, чтобы он генерировал java.util.List экземпляров Person.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...