【问题标题】:How to unmarshal nested child elements in java with same tag name?java - 如何在Java中解组具有相同标签名称的嵌套子元素?
【发布时间】:2017-01-26 14:35:15
【问题描述】:

在 Java 中,我可以通过将值添加到我的 POJO 中来读取 XML。但我不确定如何对子子节点做同样的事情。我提供了我的 POJO 示例和 XML 子类节点。

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

【问题讨论】:

  • Serge 的答案似乎正确无法理解您有什么问题
  • 看到了你的更新,但是你在使用 Serge 的 IPAddress 类吗?
  • 我认为他现在只是在使用带有包装器的字符串列表
  • @serge 可能是的。
  • 我要删除我的更新,并开始一个新的帖子。 Serge 确实在技术上回答了我最初的问题。

标签: java xml spring-boot


【解决方案1】:

你需要这样写:

@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;
    }
}

编辑 要打印它们,请执行以下操作:

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

【讨论】:

  • 我跟着你的步骤。那没起效。当我返回 ipAddresses 时,我收到一个奇怪的文本,例如 root.project.model[GFG3343]
  • 你是说反序列化的时候?你说的退货是什么意思?你能显示完整的错误吗?
  • hmmm.. 我可以从 XML 中提取我的值,例如 NODE、State.. 等它将返回 1336、CL。但我不能拉 ip_addressses,它是空白的。我实现了你的方法。但我仍然没有收到这两个 IP 地址
  • 我忘记为字符串值添加内容。你能试试这个吗?查看我的更新答案
  • 我仍然收到一个数组文本作为响应。如何将我在 IPAdress POJO 中设置的值获取到我可以打印值的主 pojo 中?在我的帖子中添加了您的方法。
【解决方案2】:

您可以将“ip_addresses”的类型从 String 更改为另一个 POJO 类。

例如

   @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;
    }

}

【讨论】:

  • 我在 @XmlElement(type = "PE") 和 "DOC" 上收到“类型不匹配:无法从字符串转换为类”
  • 在主 pojo 上定义您的字段顺序。 @XmlType(name = "readingXml", propOrder = { "node", "state", "ip_addresses" }
  • 我已经在我的主要 POJO 中添加了它。当我添加下面的代码时,我还在我的主 POJO 中收到“地址无法解析为类型”,例如;进入我的主要 POJO。
猜你喜欢
  • 2023-03-06
  • 2013-11-11
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多