SimpleFramework XML嵌套对象

时间:2015-04-28 18:54:02

标签: java xml simple-framework

我试图使用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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

  

我已经尝试过[...]但是遇到了错误

这是为了:您有两个具有相同(tag-)名称但类型不同的注释。串行器应该选择哪一个?

有两个问题需要解决:

  1. 元素有一些必需和一些可选参数(解决方案:使用简单注释的required参数)
  2. 嵌套的TestSuite元素
  3. 我已经为这个答案减少了一点问题。我们假设像这样的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.
    }
    

    的TestSuite

    @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仍然是一个选项(但更多是手动编写)。