Чтение XML-файла с помощью JAXB

1

Теперь я могу прочитать 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?

  • 0
    Попробуйте изменить тип свойства customers с ArrayList<Customer> на List<Customer> . (Не пробовал, но по крайней мере каждый пример, который я читаю, использует List и если я генерирую код из файла xsd, он тоже использует List )
  • 0
    Возможный дубликат Как читать XML-файл с JAXB?
Теги:
jaxb

2 ответа

2
Лучший ответ

Измените класс своих 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 (это просто хорошая практика).

  • 0
    Спасибо, это сработало.
0

Если у вас проблемы с аннотациями, их можно удалить и вместо этого использовать экземпляр JAXBElement. Для этого:

  1. Сначала удалите аннотацию в классе Customers

    public class Customers{
      private ArrayList<Customer> customers;
    
      public List<Customer> getCustomers() {
        return customers;
      }
    
      public void setCustomers(ArrayList<Customer> customers) {
        this.customers = customers;
      }
    
    }
    
  2. Во-вторых, используйте экземпляр 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();
      }
    }
    

Однако обратите внимание, что аннотации необходимы, если вы хотите переопределить поведение по умолчанию. Вы найдете полный пример здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню