JAXB Unmarshalling XML字符串 - 循环遍历所有标记

时间:2014-08-13 10:53:16

标签: xml loops jaxb unmarshalling

我是Java编程的新手,我正在解组以下XML字符串。我的任务是获取客户的名字 这个字符串。我为一位顾客做过。我需要获得所有客户名称。我需要循环部分的帮助。这适用于一个客户

我的Java代码:

      XMLInputFactory xif = XMLInputFactory.newFactory();
      Reader reader = new StringReader(response.toString());
      XMLStreamReader xsr = xif.createXMLStreamReader(reader);
      while(xsr.hasNext()) {
      if(xsr.isStartElement() && xsr.getLocalName().equals("customer")) {
             break;
         }
          xsr.next();
     }

     JAXBContext jc = JAXBContext.newInstance(Customer.class);
     Unmarshaller unmarshaller = jc.createUnmarshaller();
     JAXBElement<Customer> jb = unmarshaller.unmarshal(xsr,Customer.class);

      Customer customer = jb.getValue(); 
     System.out.println(customer.NAME);

客户类:

@XmlRootElement(name = "customer")
public class Customer {

public String NAME;

  public String getNAME ()
    {
       return NAME;
    }

}

数据类:

 @XmlRootElement(namespace = "data")
 public class Data
 {
 @XmlElementWrapper(name = "data")
  // XmlElement sets the name of the entities
  @XmlElement(name = "customer")
  {
   private Customer[] customer;
   public Customer[] getCustomer ()
   {
     return customer;
 }


<data>
<customer>
<name>ABC</name>
<city>DEF</city>
</customer>
<customer>
<name>ABC</name>
<city>DEF</city>
</customer>
<customer>
<name>ABC</name>
<city>DEF</city>
</customer>
</data>

3 个答案:

答案 0 :(得分:1)

以下是Java类数据和客户的修订版,以及一些要解组的代码:

@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();
}

不确定为什么使用XMLStreamReader,但如果愿意,可以更改它。

答案 1 :(得分:0)

如果您不想将某个类映射到最外层data元素,则可以按照原始问题使用StAX。

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);
            }
        }

    }

}

答案 2 :(得分:-1)

如果您使用正确的JaxB注释创建Data类,并使用包含Customers列表的字段,您将能够一次解组整个事物而无需迭代xml字符串。