Вытягивание дочернего внутреннего узла 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()....;
попробуй это может сработать