Синтаксический анализ XML с большим количеством подэлементов с помощью JAXB

#java #xml #jaxb

#java #xml #jaxb

Вопрос:

У меня есть такой XML, и я хочу разобрать его в объект Java.

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CreatePreOrderResponse>
    <Errors>
       <Error>
          <Code>code 1</Code>
          <Message>message 1</Message>
          <ErrorElement>element 1</ErrorElement>
       </Error>
       <Error>
          <Code>code 2</Code>
          <Message>message 2</Message>
          <ErrorElement>element 2</ErrorElement>
       </Error>
    </Errors>
</CreatePreOrderResponse>
  

Я работаю с JAXB для анализа строки XML, которая не имеет «подэлементов», имеет только один элемент со значениями на уровне errors .

Вопрос: Я хотел бы знать, как получить все Error элементы в Errors элементе, например, в список в CreatePreOrderResponse объекте? Возможно ли автоматически проанализировать его с JAXB помощью unmarshaller или мне нужно просматривать XML и анализировать его вручную?


ПРИМЕЧАНИЕ: просто для информации, это работает для меня — эти классы я использую для синтаксического анализа этого XML (без подэлементов).

 <CreatePreOrderResponse>
    <PreOrder>
        <ID>123456789</ID>
    </PreOrder>
</CreatePreOrderResponse>
  

BtnPreorderResponse

 @XmlRootElement(name = "CreatePreOrderResponse")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso(BtnDocLine.class)
public class BtnPreorderResponse {

    @XmlElement(name = "PreOrder")
    private BtnPreorder btnPreorder;

    @XmlElement(name = "Errors")
    private BtnErrorListType btnErrorListType;

    public BtnPreorder getBtnPreorder() {
        return btnPreorder;
    }

    public void setBtnPreorder(BtnPreorder btnPreorder) {
        this.btnPreorder = btnPreorder;
    }

    public BtnErrorListType getBtnErrorListType() {
        return btnErrorListType;
    }

    public void setBtnErrorListType(BtnErrorListType btnErrorListType) {
        this.btnErrorListType = btnErrorListType;
    }

    @Override
    public String toString() {
        return "BtnPreorderResponse{"  
                "btnPreorder="   btnPreorder  
                ", btnErrorListType="   btnErrorListType  
                '}';
    }
}
  

BtnPreorder

 @XmlRootElement(name = "PreOrder")
@XmlAccessorType(XmlAccessType.FIELD)
public class BtnPreorder {

    @XmlElement(name = "ID")
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "BtnPreorder{"  
                "id="   id  
                '}';
    }
}
  

Комментарии:

1. похоже, вы не включаете самый важный класс BtnErrorListType

Ответ №1:

Я полагаю, вы уже реализовали отдельное предложение об ошибке как класс BtnErrorType. Теперь идет их список:

 @XmlType(name = "Errors")
@XmlAccessorType(XmlAccessType.FIELD)
public class BtnErrorListType {
    @XmlElement(name = "Error")
    private ArrayList<BtnErrorType> btnError;

    ...
    public ArrayList<BtnErrorType> getBtnError() {
        if (btnError == null)
            btnError = new ArrayList<BtnErrorType>();
        return btnError;
    }
    ...
}
  

Обратите внимание, что существует только геттер, и вы должны вызвать его, если хотите добавить элементы в список.