Java JAXB解析包含单个字符串属性的包装器类
我试图解析的xml结构是:Java JAXB解析包含单个字符串属性的包装器类,java,jaxb,Java,Jaxb,我试图解析的xml结构是: <contentFiles> <contentFile> <fileNumbers> <fileNumber>123<fileNumber> </fileNumbers> </contentFile> <contentFile/> <contentFiles> 123 我如何使用JAXB解析它 我使用了上面描述的getter上的注释,但是我只得到保
<contentFiles>
<contentFile>
<fileNumbers>
<fileNumber>123<fileNumber>
</fileNumbers>
</contentFile>
<contentFile/>
<contentFiles>
123
我如何使用JAXB解析它
我使用了上面描述的getter上的注释,但是我只得到保存的文件号倍数中的最后一个元素。我想保存列表中文件号的所有元素。我该怎么做
编辑:::
@XmlRootElement(name = "contentFiles")
public class RtSuperQuickMetadata
{
private List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems;
@XmlElement(name = "contentFile")
public final List<RtSuperQuickMetadataItem> getRtSuperQuickMetadataItems()
{
return rtSuperQuickMetadataItems;
}
// Setter
}
public class RtSuperQuickMetadataItem
{
private List<FileNumber> fileNumbers;
public RtSuperQuickMetadataItem()
{
fileNumbers = new ArrayList<FileNumber>();
}
@XmlElement(name = "fileNumbers")
public List<FileNumber> getFileNumbers()
{
return fileNumbers;
}
//setter
}
@XmlRootElement(name="fileNumber")
public class FileNumber
{
private String fileNumber;
/**
* Default no-arg constructor.
*/
public FileNumber()
{
// public no-arg constructor for JAXB
}
/**
* Accept a filenumber as constructor arg.
* @param fileNumber is the fileNumber
*/
public FileNumber(final String fileNumber)
{
this.fileNumber = fileNumber;
}
/**
* Getter.
* @return the fileNumber
*/
//@XmlElement(name = "fileNumber")
public final String getFileNumber()
{
return fileNumber;
}
/**
* Setter.
* @param fileNumber to be set.
*/
public final void setFileNumber(final String fileNumber)
{
this.fileNumber = fileNumber;
}
@Override
public final String toString()
{
return fileNumber;
}
}
@XmlRootElement(name=“contentFiles”)
公共类RtSuperQuickMetadata
{
私有列表rtSuperQuickMetadataItems;
@xmlement(name=“contentFile”)
公共最终列表getRtSuperQuickMetadataItems()
{
返回rtSuperQuickMetadataItems;
}
//塞特
}
公共类RtSuperQuickMetadataItem
{
私人列表文件编号;
公共RtSuperQuickMetadataItem()
{
fileNumbers=newarraylist();
}
@xmlement(name=“fileNumbers”)
公共列表getFileNumber()
{
返回文件号;
}
//塞特
}
@XmlRootElement(name=“fileNumber”)
公共类文件号
{
私有字符串文件号;
/**
*默认无参数构造函数。
*/
公共文件号()
{
//JAXB的公共无参数构造函数
}
/**
*接受文件号作为构造函数参数。
*@param fileNumber是文件号
*/
公共文件号(最终字符串文件号)
{
this.fileNumber=文件编号;
}
/**
*盖特。
*@返回文件号
*/
//@xmlement(name=“fileNumber”)
公共最终字符串getFileNumber()
{
返回文件号;
}
/**
*塞特。
*@param要设置的文件号。
*/
公共最终void setFileNumber(最终字符串fileNumber)
{
this.fileNumber=文件编号;
}
@凌驾
公共最终字符串toString()
{
返回文件号;
}
}
我已经有一段时间没有使用JAX-B了,但我认为这应该可以解决问题(只发布了相关部分)。如果您想避免创建FileNumberList类,您可能可以使用适配器来实现,但这将是一项不值得做的工作
public class RtSuperQuickMetadataItem {
@XmlElement
public FileNumberList getFileNumbers() {
}
}
public class FileNumberList {
@XmlElement(name="fileNumber")
public List<String> getList() {
}
}
公共类RtSuperQuickMetadataItem{
@XmlElement
public FileNumberList getFileNumbers(){
}
}
公共类文件编号列表{
@xmlement(name=“fileNumber”)
公共列表getList(){
}
}
我已经有一段时间没有使用JAX-B了,但我认为这应该可以解决问题(只发布了相关部分)。如果您想避免创建FileNumberList类,您可能可以使用适配器来实现,但这将是一项不值得做的工作
public class RtSuperQuickMetadataItem {
@XmlElement
public FileNumberList getFileNumbers() {
}
}
public class FileNumberList {
@XmlElement(name="fileNumber")
public List<String> getList() {
}
}
公共类RtSuperQuickMetadataItem{
@XmlElement
public FileNumberList getFileNumbers(){
}
}
公共类文件编号列表{
@xmlement(name=“fileNumber”)
公共列表getList(){
}
}
我要求更大的XML文件表示的原因是,您的代码将完全取决于XML文件的要求。例如,这段代码可用于以下XML文件:
代码:
例如,请查看以下代码:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.*;
import javax.xml.bind.*;
public class JaxbTest {
private static final String RESOURCE_NAME = "data.xml";
public static void main(String[] args) {
// marshallTest();
unmarshallTest();
}
private static void unmarshallTest() {
JAXBContext context;
try {
context = JAXBContext.newInstance(RtSuperQuickMetadata.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
RtSuperQuickMetadata metaData = (RtSuperQuickMetadata) unmarshaller
.unmarshal(JaxbTest.class.getResourceAsStream(RESOURCE_NAME));
System.out.println(metaData);
} catch (JAXBException e) {
e.printStackTrace();
}
}
private static void marshallTest() {
RtSuperQuickMetadata data = new RtSuperQuickMetadata();
List<RtSuperQuickMetadataItem> metaItemList = new ArrayList<RtSuperQuickMetadataItem>();
RtSuperQuickMetadataItem metaDataItem = new RtSuperQuickMetadataItem();
// List<FileNumber> fileNumbers = new ArrayList<FileNumber>();
// fileNumbers.add(new FileNumber("123"));
// fileNumbers.add(new FileNumber("124"));
// fileNumbers.add(new FileNumber("125"));
// fileNumbers.add(new FileNumber("126"));
List<String> fileNumbers = new ArrayList<String>();
fileNumbers.add("123");
fileNumbers.add("124");
fileNumbers.add("125");
fileNumbers.add("126");
metaDataItem.setFileNumbers(fileNumbers);
metaItemList.add(metaDataItem);
data.setRtSuperQuickMetadataItems(metaItemList);
JAXBContext context;
try {
context = JAXBContext.newInstance(RtSuperQuickMetadata.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(data, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
@XmlRootElement(name = "contentFiles")
class RtSuperQuickMetadata {
private List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems;
@XmlElement(name = "contentFile")
public final List<RtSuperQuickMetadataItem> getRtSuperQuickMetadataItems() {
return rtSuperQuickMetadataItems;
}
public void setRtSuperQuickMetadataItems(
List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems) {
this.rtSuperQuickMetadataItems = rtSuperQuickMetadataItems;
}
@Override
public String toString() {
return "RtSuperQuickMetadata [rtSuperQuickMetadataItems="
+ rtSuperQuickMetadataItems + "]";
}
}
class RtSuperQuickMetadataItem {
private List<String> fileNumbers;
public RtSuperQuickMetadataItem() {
fileNumbers = new ArrayList<String>();
}
@XmlElementWrapper(name = "fileNumbers")
@XmlElement(name = "fileNumber")
public List<String> getFileNumbers() {
return fileNumbers;
}
public void setFileNumbers(List<String> fileNumbers) {
this.fileNumbers = fileNumbers;
}
@Override
public String toString() {
return "RtSuperQuickMetadataItem [fileNumbers=" + fileNumbers + "]";
}
}
import java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.annotation.*;
导入javax.xml.bind.*;
公共类JaxbTest{
私有静态最终字符串资源_NAME=“data.xml”;
公共静态void main(字符串[]args){
//marshallTest();
解组测试();
}
私有静态无效解组器测试(){
JAXBContext上下文;
试一试{
context=JAXBContext.newInstance(RtSuperQuickMetadata.class);
Unmarshaller Unmarshaller=context.createUnmarshaller();
RtSuperQuickMetadata元数据=(RtSuperQuickMetadata)解组器
.unmarshal(JaxbTest.class.getResourceAsStream(资源名称));
System.out.println(元数据);
}捕获(JAXBEException e){
e、 printStackTrace();
}
}
私有静态无效marshallTest(){
RtSuperQuickMetadata data=新的RtSuperQuickMetadata();
List metaItemList=新建ArrayList();
RtSuperQuickMetadataItem metaDataItem=新的RtSuperQuickMetadataItem();
//List fileNumbers=new ArrayList();
//添加(新文件号(“123”);
//添加(新文件号(“124”);
//文件编号。添加(新文件编号(“125”);
//添加(新文件号(“126”);
List fileNumbers=new ArrayList();
文件编号。添加(“123”);
文件编号。添加(“124”);
文件编号。添加(“125”);
文件编号。添加(“126”);
metaDataItem.SetFileNumber(文件编号);
添加(metaDataItem);
data.setRtSuperQuickMetadataItems(metaItemList);
JAXBContext上下文;
试一试{
context=JAXBContext.newInstance(RtSuperQuickMetadata.class);
Marshaller=context.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(数据,系统输出);
}捕获(JAXBEException e){
e、 printStackTrace();
}
}
}
@XmlRootElement(name=“contentFiles”)
类RtSuperQuickMetadata{
私有列表rtSuperQuickMetadataItems;
@xmlement(name=“contentFile”)
公共最终列表getRtSuperQuickMetadataItems(){
返回rtSuperQuickMetadataItems;
}
公共void setRtSuperQuickMetadataItems(
列出rtSuperQuickMetadataItems){
this.rtSuperQuickMetadataItems=rtSuperQuickMetadataItems;
}
@凌驾
公共字符串toString(){
返回“RtSuperQuickMetadata[rtSuperQuickMetadataItems=”
+rtSuperQuickMetadataItems+“]”;
}
}
类RtSuperQuickMetadataItem{
私人列表文件编号;
公共RtSuperQuickMetadataItem(){
fileNumbers=newarraylist();
}
@XmlElementWrapper(name=“fileNumbers”)
@xmlement(name=“fileNumber”)
公共列表getFileNumber(){
返回文件号;
}
public void setfilenumber(列出文件号){
this.fileNumbers=文件编号;
}
@凌驾
公共字符串toString(){
返回“RtSuperQuickMetadataIt”
@XmlElementWrapper(name = "fileNumbers")
@XmlElement(name = "fileNumber")
public List<String> getFileNumbers() {
return fileNumbers;
}
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.*;
import javax.xml.bind.*;
public class JaxbTest {
private static final String RESOURCE_NAME = "data.xml";
public static void main(String[] args) {
// marshallTest();
unmarshallTest();
}
private static void unmarshallTest() {
JAXBContext context;
try {
context = JAXBContext.newInstance(RtSuperQuickMetadata.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
RtSuperQuickMetadata metaData = (RtSuperQuickMetadata) unmarshaller
.unmarshal(JaxbTest.class.getResourceAsStream(RESOURCE_NAME));
System.out.println(metaData);
} catch (JAXBException e) {
e.printStackTrace();
}
}
private static void marshallTest() {
RtSuperQuickMetadata data = new RtSuperQuickMetadata();
List<RtSuperQuickMetadataItem> metaItemList = new ArrayList<RtSuperQuickMetadataItem>();
RtSuperQuickMetadataItem metaDataItem = new RtSuperQuickMetadataItem();
// List<FileNumber> fileNumbers = new ArrayList<FileNumber>();
// fileNumbers.add(new FileNumber("123"));
// fileNumbers.add(new FileNumber("124"));
// fileNumbers.add(new FileNumber("125"));
// fileNumbers.add(new FileNumber("126"));
List<String> fileNumbers = new ArrayList<String>();
fileNumbers.add("123");
fileNumbers.add("124");
fileNumbers.add("125");
fileNumbers.add("126");
metaDataItem.setFileNumbers(fileNumbers);
metaItemList.add(metaDataItem);
data.setRtSuperQuickMetadataItems(metaItemList);
JAXBContext context;
try {
context = JAXBContext.newInstance(RtSuperQuickMetadata.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(data, System.out);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
@XmlRootElement(name = "contentFiles")
class RtSuperQuickMetadata {
private List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems;
@XmlElement(name = "contentFile")
public final List<RtSuperQuickMetadataItem> getRtSuperQuickMetadataItems() {
return rtSuperQuickMetadataItems;
}
public void setRtSuperQuickMetadataItems(
List<RtSuperQuickMetadataItem> rtSuperQuickMetadataItems) {
this.rtSuperQuickMetadataItems = rtSuperQuickMetadataItems;
}
@Override
public String toString() {
return "RtSuperQuickMetadata [rtSuperQuickMetadataItems="
+ rtSuperQuickMetadataItems + "]";
}
}
class RtSuperQuickMetadataItem {
private List<String> fileNumbers;
public RtSuperQuickMetadataItem() {
fileNumbers = new ArrayList<String>();
}
@XmlElementWrapper(name = "fileNumbers")
@XmlElement(name = "fileNumber")
public List<String> getFileNumbers() {
return fileNumbers;
}
public void setFileNumbers(List<String> fileNumbers) {
this.fileNumbers = fileNumbers;
}
@Override
public String toString() {
return "RtSuperQuickMetadataItem [fileNumbers=" + fileNumbers + "]";
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contentFiles>
<contentFile>
<fileNumbers>
<fileNumber>123</fileNumber>
<fileNumber>124</fileNumber>
<fileNumber>125</fileNumber>
<fileNumber>126</fileNumber>
</fileNumbers>
</contentFile>
</contentFiles>