SimpleXML Framework返回所有嵌套元素(SimpleXML Framework returns all nested elements)

编程入门 行业动态 更新时间:2024-10-25 16:25:27
SimpleXML Framework返回所有嵌套元素(SimpleXML Framework returns all nested elements)

我有一个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类反序列化它:

Calculations.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; } }

Calculation.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教程和示例,我根本找不到为什么会发生这种情况的线索。

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

我很感激你能给予的任何帮助。

谢谢,

艾伦

I have an xml document as follows:

<?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>

I am attempting to deserialize it using the following java classes:

Calculations.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; } }

Calculation.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; } }

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

I have it running successfully (mostly) - for the moment it's just in a test project and I'm writing the details out to the console with a couple of for loops.

The trouble is that when I print it out, instead of each "Calculation" having 4 owners , what's being returned is that each calculation has 16 owners - all 16 owners are returned for each calculation, as shown from my console:

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

I've searched forums for hours and also been through the SimplXML tutorials and examples and I simply cannot find a clue as to why this is happening.

I assumed that when the "read" process iterated through that as it goes into each calculation, it would just pick the owners out of that iteration, but for some reason it's adding all of them to each calculation.

I'd appreciate any help you can give.

Thanks,

Alan

最满意答案

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


即改变这个:

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

通过静态,类的所有实例将共享相同的List,这意味着Calculation的所有实例将具有相同的Owners列表,这可能是您遇到问题的根源。 此外,您应该强烈考虑将字段设置为私有,并且只允许通过getter和setter访问。 稍后您可能只想发布原始列表的深层副本,只有在限制对字段的直接访问时才能实现此目的。

I recommend that you not use static List fields, that instead you use non-static or instance List fields in your classes.


i.e., change this:

@ElementList public static List<Owner> owners;

to this:

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

and the same for changing this:

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

to this:

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

By being static, all instances of the class will share the same List, meaning all instances of Calculation will have the same list of Owners, and this may be a source of problems for you. Also you should strongly consider making the fields above private, and allowing access only through the getters and setters. Later you might want to only release a deep copy of the original List, and this can be accomplished only if you limit direct access to the fields.

更多推荐

本文发布于:2023-08-04 13:52:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1416445.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:嵌套   元素   Framework   SimpleXML   nested

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!