Вытягивание дочернего внутреннего узла XML из XML в объект Java с использованием JAXB

Я пытался извлечь дочерний узел из XML, который я получил от SOAP в виде строки. Я могу получить родительский узел, но не могу получить дочерний узел. Я также захожу в интернет, чтобы узнать, смогу ли я получить ответ, но все безрезультатно. Я видел несколько примеров с прямым вытягиванием ребенка, но это не решило мою проблему.

<response>
  <code>1</code>
  <list available="2">
     <cart id="2" name="egg">
        <stuff>
           <id>001</id>
           <name>Crew</name>
           <shortname>C</shortname>
        </stuff>
     </cart>
     <cart id="4" name="bread">
        <stuff>
           <id>004</id>
           <name>Bread</name>
           <shortname>B</shortname>
        </stuff>
     </cart>
  </list>
</response>

Класс ответа

public class Response {
   private String code;
   private String list;
   private String cart;
   private Response.Stuff stuffs;


   @XmlElement(name="code")
   public String getCode() {
     return code;
   }

   public void setCode(String code) {
     this.code = code;
   }
   .
   .
  @XmlElement
  public Response.Stuff getStuff() {
    return this.stuffs;
  }

  public void setStuff(Response.Cart stuff) {
    this.stuffs = stuff;
  }

 public static class Stuff {
   private List<Stuff> stuff;

   public List<Stuff> getStuff() {
     if (stuff == null) {
        stuff = new ArrayList<Stuff>();
     }
   return stuff;
  }
}

}

Stuff Classs

public class Stuff {
  private String id;
  private String crew;

 @XmlElement
 public String getId() {
  return this.id;
 }

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

}

Теперь моя проблема заключается в том, как извлечь содержимое дочерних элементов (т. Е. Id, name и shortname) с помощью JAXB. Я создал класс Response и Stuff и сделал вещи списком внутри ответа, но когда я запускаю код, он выдает нулевое исключение.

PS: пожалуйста, помните, что XML не является файлом, это строка, и я использую StringReader класс для JAXB.unmarshal

2 ответа

Решение

Я наконец решил свою проблему, реструктурируя вышеупомянутый класс и создав новый. Смотрите ниже обновленный:

public class Response {
   private String code;
   private List list;

   @XmlElement(name="code")
   public String getCode() {
     return code;
   }

  public void setCode(String code) {
    this.code = code;
  }

  @XmlElement(name= "list")
  public List getlist() {
    return this.list;
  }

  public void setList(List list) {
    this.list = list;
  }

}

Список классов

@XmlRootElement(name= "list")
public class List {
  private List.Cart cart;

  @XmlElement(name= "cart")
  public List<Cart> getCart() {
    return this.cart;
  }

  public void setCart(Cart cart) {
    this.cart = cart;
  }


@XmlRootElement(name= "cart")
public static class Cart {
   private List<Stuff> stuff;

   private List<Stuff> getStuff() {
     if (stuff == null) {
       stuff = new ArrayList();
     }
     return stuff;
  }
}

}

С этим мне было легко маршал и демаршалл

JAXBContext jcontext = JAXBContext.newInstance ();

unmarshaller um = jcontext.createUnmarshaller ();

JAXBElement je = um.unmarshal (новый файл ("местоположение файла xml передачи"));

ответ r = getValue();

r.getlist () getcart () getstuff() GetId() GetValue()....;

попробуй это может сработать

Другие вопросы по тегам