JAXB Unmarshalling XML string - Looping through all tags

纵然是瞬间 提交于 2019-12-02 07:17:48

Here is a revision of you Java classes Data and Customer, plus some code to unmarshal:

@XmlRootElement  
public class Response {
  @XmlElement
  private Data data;
  public Data getData(){ return data; }
  public void setData( Data value ){ data = value; }
}

public class Data {    // omitted namespace="data" as it isn't in the XML
  @XmlElement(name = "customer")
  private List<Customer> customer;          // List is much better than array
  public List<Customer> getCustomer (){
    if( customer == null ){
      customer = new ArrayList<>();
    }
    return customer;
  }
}

@XmlType(name = "Customer")
public class Customer {
  private String name;         // stick to Java conventions: lower case
  public String getName (){
    return name;
  }
  public void setName( String value ){
    name = value;
  }
}

JAXBContext jc = JAXBContext.newInstance( Response.class );
Unmarshaller m = jc.createUnmarshaller();
Data data = null;
try{
  // File source = new File( XMLIN );
  StringReader source = new StringReader( stringWithXml ); // XML on a String
  data = (Data)m.unmarshal( source );
  for( Customer cust: data.getCustomer() ){
    System.out.println( cust.getName() );
  }
} catch( Exception e  ){
  System.out.println( "EXCEPTION: " + e.getMessage() );
  e.printStackTrace();
}

Not sure why you use an XMLStreamReader, but you can change this if you like.

If you don't want to map a class to the outer most data element, below is how you could use StAX as per your original question.

import java.io.*;
import javax.xml.bind.*;
import javax.xml.stream.*;

public class Demo {

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

        FileReader reader = new FileReader("input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(reader);

        JAXBContext jc = JAXBContext.newInstance(Customer.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();

        while(xsr.hasNext()) {
            while(xsr.hasNext() && (!xsr.isStartElement() || !xsr.getLocalName().equals("customer"))) {

                xsr.next();
            }
            if(xsr.hasNext()) {
                Customer customer = (Customer) unmarshaller.unmarshal(xsr);
                System.out.println(customer);
            }
        }

    }

}

If you create Data class with proper JaxB annotations and with field that is a list of Customers, you will be able to unmarshall entire thing at once without iterating through xml string.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!