我是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>
答案 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字符串。