Я создал свой собственный 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