我正在尝试构建一个Jersey Web服务,它将接收数据,将其格式化为XML文档,然后将其传递给另一个服务.我意识到Jersey确实有XML支持,但由于项目所需的XML结构,我在实现它时遇到了一些麻烦.所需的输出看起来像这样:
<root-element>
<table>
<row>
<d>data1</d>
<d>data2</d>
<d>data3</d>
</row>
<row>
<d>data4</d>
<d>data5</d>
<d>data6</d>
</row>
</table>
Run Code Online (Sandbox Code Playgroud)
我的问题出现了,有一些变量<d>和<row>元素,它们将根据传入的数据确定.我知道我可以@XmlRootElement在处理数据的类之上格式化一个简单的表,但这可能只对我<root-element>的元素只会填充其他元素.我知道我需要使用某种循环来创建每个<row>,但我不确定如何<d>在每个字段中创建具有不同数据的每个元素.有什么建议?
您可以使用带有JAXB(JSR-222)注释的Java模型来支持您的用例.可能出现多次的元素将对应List于Java模型中的属性.下面是如何映射文档的示例.
表
我们将使用@XmlElementWrapper注释添加分组元素,并使用@XmlElement注释来设置集合中项目的元素名称.
package forum11543081;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="root-element")
@XmlAccessorType(XmlAccessType.FIELD)
public class Table {
@XmlElementWrapper(name="table")
@XmlElement(name="row")
private List<Row> rows;
}
Run Code Online (Sandbox Code Playgroud)
行
如果属性/字段的名称与生成的XML元素的名称匹配,则不需要任何注释.
package forum11543081;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Row {
private List<String> d;
}
Run Code Online (Sandbox Code Playgroud)
演示
下面是一个独立的示例来证明映射有效:
package forum11543081;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Table.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum11543081/input.xml");
Table table = (Table) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(table, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
input.xml中/输出
<root-element>
<table>
<row>
<d>data1</d>
<d>data2</d>
<d>data3</d>
</row>
<row>
<d>data4</d>
<d>data5</d>
<d>data6</d>
</row>
</table>
</root-element>
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息
| 归档时间: |
|
| 查看次数: |
4937 次 |
| 最近记录: |