我正在尝试使用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


有什么想法吗?

最佳答案

我已经尝试过[...]但正在遇到错误


这旨在:您有两个具有相同(标签)名称但类型不同的注释。串行器应该选择哪一个?



有两个问题要解决:


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


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

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


诀窍:使用@ElementListUnion和某种接口(或抽象基类)



代码如下:

TestEntry(只是一个接口)

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(但更多内容可以手动编写)。

09-13 06:08