Как повторно использовать атрибут родительского элемента, если он недоступен в дочернем элементе? - PullRequest
0 голосов
/ 11 июня 2019

Я создал свой собственный XML для хранения тестовых случаев.Все атрибуты в каждом элементе необходимы, чтобы иметь полный конечный объект Test.

Не нужно переписывать одну и ту же информацию снова и снова, поэтому элемент так, что все дочерние элементы должны наследовать свойство (атрибут) родительского объекта, недоступен в дочернем элементе.

TestSuite.xml

<TestSuite project="PRJ_Test" sim="sim_1.file">
    <LogicalLink linkName="LL_1">
        <TestJob expected="JobExp" actual="JobAct" >
            <TestCase name="TC_1"/>
        </TestJob>
        <TestJob expected="JobExp" actual="JobAct" sim="sim_2.file" >
            <TestCase name="TC_2"/>
            <TestCase name="TC_3" sim="sim_3.file"/>
        </TestJob>
    </LogicalLink>
    <LogicalLink linkName="LL_2" sim="sim_4.file">
        <TestJob expected="JobExp" actual="JobAct">
            <TestCase name="TC_4"/>
        </TestJob>
    </LogicalLink>
</TestSuite>

Модели:

@XmlRootElement(name = "TestSuite")
public class TestSuite {
    private String project;
    protected String sim;
    private List<LogicalLink> logicalLinks;

    @XmlAttribute
    public String getProject() {
        return project;
    }

    public void setProject(String project) {
        this.project = project;
    }

    @XmlElement(name="LogicalLink")
    public List<LogicalLink> getLogicalLinks() {
        return logicalLinks;
    }

    public void setLogicalLinks(List<LogicalLink> logicalLink) {
        this.logicalLinks = logicalLink;
    }

    @XmlAttribute
    public String getSim() {
        return sim;
    }

    public void setSim(String sim) {
        this.sim = sim;
    }
}

public class LogicalLink extends TestSuite {
    private String linkName;
    private List<TestJob> testJobs;

    @XmlAttribute
    public String getLinkName() {
        return linkName;
    }

    public void setLinkName(String linkName) {
        this.linkName = linkName;
    }

    @XmlElement(name = "TestJob")
    public List<TestJob> getTestJobs() {
        return testJobs;
    }

    public void setTestJobs(List<TestJob> testJobs) {
        this.testJobs = testJobs;
    }
}

public class TestJob extends LogicalLink {
    private String expected;
    private String actual;
    private List<TestCase> testCases;

    @XmlAttribute
    public String getExpected() {
        return expected;
    }

    public void setExpected(String jobOld) {
        this.expected = jobOld;
    }

    @XmlAttribute
    public String getActual() {
        return actual;
    }

    public void setActual(String jobNew) {
        this.actual = jobNew;
    }

    @XmlElement(name = "TestCase")
    public List<TestCase> getTestCases() {
        return testCases;
    }

    public void setTestCases(List<TestCase> testCases) {
        this.testCases = testCases;
    }
}

public class TestCase extends TestJob{
    private String name;

    @XmlAttribute
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Синтаксический анализ:

JAXBContext jaxbContext = JAXBContext.newInstance(TestSuite.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
TestSuite testSuite = (TestSuite) jaxbUnmarshaller.unmarshal("TestSuite.xml");

Когда я получаю List путем обхода из TestSuite, все свойства недоступны в элементе TestCase (например, атрибут sim)имеют значение null, которое должно быть выбрано из родительских элементов.

Наконец, я хочу получить список TestCases, как показано ниже (фокус - атрибут 'sim').

TestCase1:
    name="TC_1"
    expected="JobExp1" 
    actual="JobAct1"
    linkName="LL_1"
    project="PRJ_Test"
    sim="sim_1.file" // because given in TestSuite (parent) and not overriden till TC_1

TestCase2:
    name="TC_2"
    expected="JobExp2" 
    actual="JobAct2"
    linkName="LL_1"
    project="PRJ_Test"
    sim="sim_2.file" //because overriden in TestJob (parent) element

TestCase3:
    name="TC_3"
    expected="JobExp2" 
    actual="JobAct2"
    linkName="LL_1"
    project="PRJ_Test"
    sim="sim_3.file" //because overriden in TestCase (self) element

TestCase4:
    name="TC_4"
    expected="JobExp3" 
    actual="JobAct3"
    linkName="LL_2"
    project="PRJ_Test"
    sim="sim_4.file"//because overriden in LogicalLink (parent) element
...