簡體   English   中英

SimpleFramework XML嵌套對象

[英]SimpleFramework XML nested objects

我正在嘗試使用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. 元素具有一些必需參數和一些可選參數(解決方案:使用簡單注釋的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 某種接口 (或抽象基類)


代碼如下:

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 (但可以手動編寫)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM