gpt4 book ai didi

java - SimpleXML 框架返回所有嵌套元素

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:04 25 4
gpt4 key购买 nike

我有一个xml文档如下:

<?xml version="1.0" encoding="utf-8"?>
<Calculations>
<desc>Calculations Description</desc>
<Calculation operator="ADD" valueA="1" valueB="2">
<desc>First Description</desc>
<owners>
<owner id="1"><name>Alan</name></owner>
<owner id="2"><name>Karen</name></owner>
<owner id="3"><name>Isla</name></owner>
<owner id="4"><name>Bethany</name></owner>
</owners>
</Calculation>
<Calculation operator="SUBTRACT" valueA="3" valueB="1">
<desc>Second Description</desc>
<owners>
<owner id="10"><name>Christopher</name></owner>
<owner id="11"><name>David</name></owner>
<owner id="12"><name>Matt</name></owner>
<owner id="13"><name>Peter</name></owner>
</owners>
</Calculation>
<Calculation operator="MULTIPLY" valueA="2" valueB="5">
<desc>Third Description</desc>
<owners>
<owner id="10"><name>Christopher</name></owner>
<owner id="11"><name>David</name></owner>
<owner id="12"><name>Matt</name></owner>
<owner id="13"><name>Peter</name></owner>
</owners>
</Calculation>
<Calculation operator="DIVIDE" valueA="2" valueB="5">
<desc>Fourth Description</desc>
<owners>
<owner id="10"><name>Christopher</name></owner>
<owner id="11"><name>David</name></owner>
<owner id="12"><name>Matt</name></owner>
<owner id="13"><name>Peter</name></owner>
</owners>
</Calculation>
</Calculations>

我正在尝试使用以下 java 类对其进行反序列化:

计算.java:

package Simple;

import java.util.List;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

@Root(name="Calculations")
public class Calculations {

@Element(name="desc")
private String text;

@ElementList(inline=true)
public static List<Calculation> calculations;


public Calculations() {
super();
}
public List<Calculation> getCalculations() {
return calculations;
}
public String getDescription() {
return text;
}

}

计算.java:

package Simple;

import java.util.List;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

@Root(name="Calculation")
public class Calculation {
public Calculation() {
super();
}

@Attribute(name="operator")
private String operator;


@ElementList
public static List<Owner> owners;

public String getOperator() {
return operator;
}

public List<Owner> getOwners() {
return owners;
}

}

和owner.java:

package Simple;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root(name="Owner")
public class Owner {
public Owner() {
super();
}

@Attribute(name="id")
private String id;

@Element(name="name")
private String name;

public String getID() {
return id;
}

public String getName() {
return name;
}
}

我已经成功运行(大部分) - 目前它只是在一个测试项目中,我正在使用几个 for 循环将详细信息写入控制台。

问题是,当我打印出来时,不是每个“计算”都有 4 个所有者,而是返回的是每个计算有 16 个所有者 - 每个计算都会返回所有 16 个所有者,如我的控制台所示:

ADD
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
SUBTRACT
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
MULTIPLY
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
DIVIDE
- Alan
- Karen
- Isla
- Bethany
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
- Christopher
- David
- Matt
- Peter
end

我已经搜索了几个小时的论坛,也浏览了 SimplXML 教程和示例,但我根本找不到关于为什么会发生这种情况的线索。

我假设,当“读取”过程在进入每个计算时迭代该过程时,它只会从该迭代中选择所有者,但由于某种原因,它将所有所有者添加到每个计算中。

非常感谢您能提供的任何帮助。

谢谢

艾伦

最佳答案

我建议您不要使用静态列表字段,而是在类中使用非静态或实例列表字段。

<小时/>

即更改此:

@ElementList
public static List<Owner> owners;

对此:

@ElementList
public List<Owner> owners; // not static
<小时/>

更改此内容也是如此:

@ElementList(inline=true)
public static List<Calculation> calculations;

对此:

@ElementList(inline=true)
public List<Calculation> calculations;
<小时/>

由于是静态的,类的所有实例将共享相同的列表,这意味着计算的所有实例将具有相同的所有者列表,这可能会给您带来问题。此外,您还应该强烈考虑将上述字段设为私有(private),并仅允许通过 getter 和 setter 进行访问。稍后您可能只想发布原始列表的深拷贝,并且只有限制对字段的直接访问才能实现这一点。

关于java - SimpleXML 框架返回所有嵌套元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25435345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com