2017-01-26 2 views
3

В Java я могу читать XML, добавляя значения в мой POJO. Но я не уверен, как я мог бы сделать то же самое с дочерними узлами. Я представил пример POJO и узел подкласса XML.Как развязать вложенные дочерние элементы в java с тем же именем тега?

XML:

<results> 
    <rootNode> 
     <node>1336</node> 
     <state>CL</state> 
     <time>0</time> 
     <ip_addresses> 
      <ip_address type="DOC">06:56:43.0</ip_address> 
      <ip_address type="PE">06:56:43.0</ip_address> 
     </ip_addresses> 
     <lease_date>2017-01-25</lease_date> 
    </rootNode> 
</results> 

POJO:

@XmlRootElement(name = "rootNode") 
@XmlAccessorType (XmlAccessType.FIELD) 
public class readingXml 
{ 
    private int id; 

    @XmlElement(name = "node") 
    private String node; 
    @XmlElement(name = "state") 
    private String state; 

    // How to do the same with sub child-nodes 
    @XmlElement(name = "ip_addresses") 
    private String ip_addresses; 
    // What to do here? 

    @XmlElement(name = "lease_date") 
    private String lease_date; 

    // Getters and setters for all above 
+0

Serge ответ кажется правильным, не может понять, что проблема вы –

+0

видели ваши обновления, но это становится запутанным вы используете класс IPAddress Сержа? –

+0

Я думаю, что он просто использует список строк с оберткой прямо сейчас – serge

ответ

2

Вам нужно положить что-то вроде этого:

@XmlElement(name = "ip_addresses") 
private IPAddresses ipAddresses; 

и класс IPAddresses POJO:

@XmlRootElement(name = "ip_addresses") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class IPAddresses implements Serializable { 
    private final static long serialVersionUID = 1L; 

    @XmlElement(name = "ip_address") 
    private List<IPAddress> ipAddresses; 

    public List<IPAddress> getIpAddresses() { 
     return ipAddresses; 
    } 
    public void setIpAddresses(List<IPAddress> ipAddresses) { 
     this.ipAddresses = ipAddresses; 
    } 
} 

Где IPAddress - еще один класс POJO, который описывает структуру отдельного элемента.

@XmlRootElement(name = "ip_address") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class IPAddress implements Serializable { 
    private final static long serialVersionUID = 1L; 
    @XmlValue 
    protected String content; 
    @XmlAttribute(name = "type") 
    protected String type; 

    public void setContent(String content) { 
     this.content = content; 
    } 
    public String getContent() { 
     return content; 
    } 

    public void setType(String content) { 
     this.type = type; 
    } 
    public String getType() { 
     return type; 
    } 
} 

EDIT Чтобы напечатать их сделать что-то вроде этого:

for (IPAddress ipAddress in custinfo.getIpAddresses().getIpAddresses()) { 
    System.out.println("value: " + ipAddress.getContent()); 
    System.out.println("type: " + ipAddress.getType()); 
} 
+0

Я следовал за твоими шагами. Это не работает. Когда я возвращаю ipAddresses, я получаю странный текст, например root.project.model [GFG3343] –

+0

Вы имеете в виду, когда вы deserialize? Что вы подразумеваете под возвращением? Можете ли вы показать полную ошибку? – serge

+0

hmmm .. Я могу вытащить мои ценности из XML, такие как NODE, State .. и т. Д. Он вернет 1336, CL. Но я не могу вытащить ip_addressses, он приходит как пустой. Я реализовал ваш метод. Но я все еще не получаю два IP-адреса –

1

Вы можете изменить тип "ip_addresses" из строки в другой класс POJO.

E.g.

@XmlElement(name = "ip_addresses") 
    private List<Address> ip_addresses; 

А затем указать адрес POJO как

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "ip_addresses") 
public class Address { 

    @XmlElement(type = "DOC") 
    protected String ip_address1; 

    @XmlElement(type = "PE") 
    protected String ip_address2; 

    public String getIp_address1() { 
     return ip_address1; 
    } 

    public void setIp_address1(String value) { 
     this.ip_address1= value; 
    } 

    public String getIp_address2() { 
     return ip_address2; 
    } 

    public void setIp_address2(String value) { 
     this.ip_address2= value; 
    } 

} 
+0

Я получаю «несоответствие типа: невозможно преобразовать из строки в класс» в @XmlElement (type = «PE») и «DOC» –

+0

Определите свой заказ на поле в основном pojo. '@XmlType (имя = "readingXml", propOrder = { "узел", "состояние", " ip_addresses" }' – VHS

+0

Я добавил, что в моем основном POJO. Я также получить «Адрес не может быть решен в тип "в моем основном POJO, когда я добавил код ниже, например, в мой основной POJO. –

Смежные вопросы