Теперь я могу прочитать xml файл:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="100" r="q">
<datas>
<data>
<age>29</age>
<name>mky</name>
</data>
</datas>
</customer>
Использование класса Customer:
@XmlRootElement
public class Customer {
String name;
String age;
String id;
String r;
@XmlAttribute
public void setR(String R) {
this.r = R;
}
/etc
}
Я решил расширить XML файл для поддержки нескольких клиентов:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customers>
<customer id="100" r="q">
<age>29</age>
<name>mky</name>
</customer>
<customer id="101" r="q">
<age>29</age>
<name>mky</name>
</customer>
</customers>
Затем я столкнулся с некоторыми проблемами, пытаясь это прочитать.
Я попробовал добавить класс Customers:
@XmlRootElement
public class Customers{
private ArrayList<Customer> customers;
public List<Customer> getCustomers() {
return customers;
}
@XmlElement
public void setCustomers(ArrayList<Customer> customers) {
this.customers = customers;
}
}
И затем, пытаясь напечатать это с помощью:
try {
File file = new File("/Users/s.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customers.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customers c = (Customers) jaxbUnmarshaller.unmarshal(file);
System.out.println(c.getCustomers());
} catch (JAXBException e) {
e.printStackTrace();
}
}}
Но я получаю нулевое значение для попытки распечатать это. Может кто-нибудь просветить меня о том, как я могу прочитать второй файл XML?
Измените класс своих Customers
на
@XmlRootElement(name = "customers")
class Customers {
private List<Customer> customers;
public List<Customer> getCustomers() {
return customers;
}
@XmlElement(name = "customer")
public void setCustomers(List<Customer> customers) {
this.customers = customers;
}
}
То, что вы не хотите, - это несоответствие между методами get/set для элемента XML. Если кто-то возвращает ArrayList
, другой должен принять аргумент ArrayList
. Аналогично для List
(это просто хорошая практика).
Если у вас проблемы с аннотациями, их можно удалить и вместо этого использовать экземпляр JAXBElement
. Для этого:
Сначала удалите аннотацию в классе Customers
public class Customers{
private ArrayList<Customer> customers;
public List<Customer> getCustomers() {
return customers;
}
public void setCustomers(ArrayList<Customer> customers) {
this.customers = customers;
}
}
Во-вторых, используйте экземпляр JAXBElement
в методе разбора
try {
File file = new File("/Users/s.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customers.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
JAXBElement<Customers> je1 = unmarshaller.unmarshal(file, Customers.class);
Customers c = je1.getValue();
System.out.println(c.getCustomers());
} catch (JAXBException e) {
e.printStackTrace();
}
}
Однако обратите внимание, что аннотации необходимы, если вы хотите переопределить поведение по умолчанию. Вы найдете полный пример здесь.
customers
сArrayList<Customer>
наList<Customer>
. (Не пробовал, но по крайней мере каждый пример, который я читаю, используетList
и если я генерирую код из файла xsd, он тоже используетList
)