gpt4 book ai didi

java - SimpleFramework XML 嵌套对象

转载 作者:行者123 更新时间:2023-11-30 08:13:32 27 4
gpt4 key购买 nike

我正在尝试使用 simpleframework 序列化第三方 (parasoft) xml 报告。

<TestSuite authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0" pass="42" total="42">
<TestSuite authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0" name="Test Suite: APIs">
<TestSuite authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0">
<Test authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0" />
<Test authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0" id="wk:///2" name="Test 2: GetControlParams" pass="1" tool="GetControlParams" total="1" />
</TestSuite>
<TestSuite authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0">
<Test authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0" name="Test 1: GetHouseInfo" pass="1" tool="GetHouseInfo" total="1" />
<Test authChange="" authFail="" change="0" changePass="0" changeTotal="0" fail="0" name="Test 2: GetHouseInfo" pass="1" tool="GetHouseInfo" total="1" />
</TestSuite>
</TestSuite>
</TestSuite>

如何处理 TestSuite 的递归关系?

我试过了

@Element(name = "TestSuite", required = false)
private TestSuite testSuite;

@ElementList(inline = true, entry = "Test", required = false)
private List<Test> test;

@ElementList(inline = true, entry = "TestSuite", required = false)
private List<TestSuite> testSuites;

但是我遇到了错误

Exception in thread "main" org.simpleframework.xml.core.PersistenceException: Duplicate annotation of name 'TestSuite' on field 'testSuites' private java.util.List TestSuite.testSuites

有什么想法吗?

最佳答案

I've tried [...] But am running up against the error

这是有意的:您有两个具有相同(标签)名称但类型不同的注释。序列化器应该选择哪一个?


有两个问题需要解决:

  1. 元素有一些必需的和一些可选的参数(解决方案:使用 simples 注释的 required 参数)
  2. 嵌套的 TestSuite 元素

我已经为这个答案减少了一些问题。让我们假设一个像这样的 Xml:

<TestSuite change="1" name="suite lvl 2">
<TestSuite change="0">
<Test name="test1" />
<Test name="test2" fail="0" />
</TestSuite>
</TestSuite>

技巧:使用 @ElementListUnion 某种接口(interface)(或抽象基类)


代码:

TestEntry(只是一个接口(interface))

public interface TestEntry
{
}

测试用例

@Root(name = "Test")
public class TestCase implements TestEntry
{
@Attribute(required = false)
private int fail;
@Attribute
private String name;

// Getter etc.
}

测试套件

@Root(name = "TestSuite")
public class TestSuite implements TestEntry
{
@Attribute
private int change;
@Attribute(required = false)
private String name;
@ElementListUnion({
@ElementList(inline = true, required = false, type = TestCase.class, name = "TestCase"),
@ElementList(inline = true, required = false, type = TestSuite.class, name = "TestSuite")
})
private List<TestEntry> content;

// Getter etc.
}

你看到诀窍了吗?现在您可以在该列表中包含 TestCaseTestSuite

最后,您可以添加外部 TestSuite 并且 - 当然 - 完成属性。

顺便说一句。如果您在决定元素是 X 型还是 Y 型时遇到困难 - Converter仍然是一个选项(但更多的是手动编写)。

关于java - SimpleFramework XML 嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927620/

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