JAXB 嵌套 XML - 列表 <Object> 具有相同名称的属性:无法显示 XML 数据
JAXB Nested XML - List<Object> same names with attributes: unable to display XML data
我有一个 xml 看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<TestCases>
<TestCase id="TC04">
<statement sequence="1">This is TC04, statement 1</statement>
<statement sequence="2">This is TC04, statement 2</statement>
<statement sequence="3">This is TC04, statement 3</statement>
<statement sequence="4">This is TC04, statement 4</statement>
</TestCase>
<TestCase id="TC05">
<statement sequence="1">This is TC05, statement 1</statement>
<statement sequence="2">This is TC05, statement 2</statement>
<statement sequence="3">This is TC05, statement 3</statement>
<statement sequence="4">This is TC05, statement 4</statement>
</TestCase>
</TestCases>
至此,我可以获取到TestCases下的所有TestCase,并显示序号。
TC04
1=空,2=空,3=空,4=空
TC05
1=空,2=空,3=空,4=空
但是,在显示值时,我得到的是空值。我认为这需要一个 XMLAdapter 但我不熟悉也无法理解如何创建一个 reads/stores 语句节点的属性和 xml 数据的适配器。
下面是我的 Java 代码。
package Test;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "TestCases")
public class TestCases {
@XmlElement(name = "TestCase")
private List<TestCase> testcases;
public List<TestCase> getTestCases() {
if (this.testcases == null)
this.testcases = new ArrayList<TestCase>();
return testcases;
}
@XmlRootElement(name = "TestCase")
public static class TestCase {
@XmlAttribute(name = "id")
private String id;
public String getId() {
return this.id;
}
@XmlElement(name = "statement")
public List<Statement> statements;
public List<Statement> getStatements() {
if (this.statements == null)
this.statements = new ArrayList<Statement>();
return statements;
}
@XmlRootElement(name = "statement")
public static class Statement {
private String name;
@XmlAttribute(name = "sequence")
private String sequence;
public String getSequence() {
return this.sequence;
}
public String getStatement() {
return this.name;
}
}
}
}
- 您应该只在
TestCases
上使用 @XmlRootElement
。
您可能还需要在 name
上使用 @XmlValue
然后添加
@XmlAccessorType(XmlAccessType.FIELD)
在你的 class 上。
This post 可能会有帮助。
@XmlRootElement(name = "TestCases")
public class TestCases {
@XmlElement(name = "TestCase")
private List<TestCase> testcases;
public List<TestCase> getTestCases() {
if (this.testcases == null)
this.testcases = new ArrayList<TestCase>();
return testcases;
}
public static class TestCase {
@XmlAttribute(name = "id")
private String id;
public String getId() {
return this.id;
}
@XmlElement(name = "statement")
public List<Statement> statements;
public List<Statement> getStatements() {
if (this.statements == null)
this.statements = new ArrayList<Statement>();
return statements;
}
@XmlAccessorType(XmlAccessType.FIELD)
public static class Statement {
@XmlValue
private String name;
@XmlAttribute(name = "sequence")
private String sequence;
public String getSequence() {
return this.sequence;
}
public String getStatement() {
return this.name;
}
}
}
}
我有一个 xml 看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<TestCases>
<TestCase id="TC04">
<statement sequence="1">This is TC04, statement 1</statement>
<statement sequence="2">This is TC04, statement 2</statement>
<statement sequence="3">This is TC04, statement 3</statement>
<statement sequence="4">This is TC04, statement 4</statement>
</TestCase>
<TestCase id="TC05">
<statement sequence="1">This is TC05, statement 1</statement>
<statement sequence="2">This is TC05, statement 2</statement>
<statement sequence="3">This is TC05, statement 3</statement>
<statement sequence="4">This is TC05, statement 4</statement>
</TestCase>
</TestCases>
至此,我可以获取到TestCases下的所有TestCase,并显示序号。
TC04 1=空,2=空,3=空,4=空 TC05 1=空,2=空,3=空,4=空
但是,在显示值时,我得到的是空值。我认为这需要一个 XMLAdapter 但我不熟悉也无法理解如何创建一个 reads/stores 语句节点的属性和 xml 数据的适配器。
下面是我的 Java 代码。
package Test;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "TestCases")
public class TestCases {
@XmlElement(name = "TestCase")
private List<TestCase> testcases;
public List<TestCase> getTestCases() {
if (this.testcases == null)
this.testcases = new ArrayList<TestCase>();
return testcases;
}
@XmlRootElement(name = "TestCase")
public static class TestCase {
@XmlAttribute(name = "id")
private String id;
public String getId() {
return this.id;
}
@XmlElement(name = "statement")
public List<Statement> statements;
public List<Statement> getStatements() {
if (this.statements == null)
this.statements = new ArrayList<Statement>();
return statements;
}
@XmlRootElement(name = "statement")
public static class Statement {
private String name;
@XmlAttribute(name = "sequence")
private String sequence;
public String getSequence() {
return this.sequence;
}
public String getStatement() {
return this.name;
}
}
}
}
- 您应该只在
TestCases
上使用@XmlRootElement
。 您可能还需要在
name
上使用@XmlValue
然后添加@XmlAccessorType(XmlAccessType.FIELD)
在你的 class 上。 This post 可能会有帮助。@XmlRootElement(name = "TestCases") public class TestCases { @XmlElement(name = "TestCase") private List<TestCase> testcases; public List<TestCase> getTestCases() { if (this.testcases == null) this.testcases = new ArrayList<TestCase>(); return testcases; } public static class TestCase { @XmlAttribute(name = "id") private String id; public String getId() { return this.id; } @XmlElement(name = "statement") public List<Statement> statements; public List<Statement> getStatements() { if (this.statements == null) this.statements = new ArrayList<Statement>(); return statements; } @XmlAccessorType(XmlAccessType.FIELD) public static class Statement { @XmlValue private String name; @XmlAttribute(name = "sequence") private String sequence; public String getSequence() { return this.sequence; } public String getStatement() { return this.name; } } } }