Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在类结构更改后,面临解组旧xml的问题_Java_Xml_Jaxb_Unmarshalling - Fatal编程技术网

Java 在类结构更改后,面临解组旧xml的问题

Java 在类结构更改后,面临解组旧xml的问题,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我正在努力解组一个结构与当前对象结构不同的旧xml文件 以前的结构 @xmlRootElement("configData") public class configData{ private string name; private string age; private customObject obj; } 我目前的数据结构是 @xmlRootElement("configData") public class configData{ List<SampleD

我正在努力解组一个结构与当前对象结构不同的旧xml文件

以前的结构

@xmlRootElement("configData")
public class configData{  
 private string name; 
 private string age; 
 private customObject obj;
}
我目前的数据结构是

@xmlRootElement("configData")
public class configData{  
  List<SampleData> sampleDatas;;

}

public class SampleData{
  private string name; 
  private string age; 
  private customObject obj;

 }
@xmlRootElement(“configData”)
公共类configData{
列出样本数据;;
}
公共类抽样数据{
私有字符串名称;
私弦时代;
私有对象对象;
}
如何使用旧的xml文件。请帮忙


谢谢

您的旧结构表明,XML文件中只存在一组
SampleData

所以你应该试试这样:

@XmlRootElement
public class ConfigData
{
  // This will hide the list from JAXB
  @XmlTransient
  private final List<SampleData> sampleDatas = new ArrayList<>();

  private SampleData getFirstSample()
  {
    if(sampleDatas.isEmpty())
      sampleDatas.add(new SampleData());
    return sampleDatas.get(0);
  }

  // Façade methods to delegate functionality to the list's first item...
  // Only setters are required, if you just want to read in an old format.
  // However this would not be optional, if you want to save to the new format...
  public void setName(String name)
  {
    getFirstSample().setName(name);
  }

  public void seAge(String age)
  {
    getFirstSample().setAge(age);
  }

  public void setObj(CustomObject obj)
  {
    getFirstSample().setObj(obj);
  }
}

public class SampleData
{
  private String name; 
  private String age; 
  private CustomObject obj;
  // Accessor methods...
}
@XmlRootElement
公共类配置数据
{
//这将对JAXB隐藏该列表
@XmlTransient
private final List sampleDatas=new ArrayList();
私有SampleData getFirstSample()
{
if(sampleDatas.isEmpty())
添加(新的SampleData());
返回sampleDatas.get(0);
}
//将功能委托给列表第一项的Façade方法。。。
//如果您只想以旧格式读取,则只需要设置器。
//但是,如果要保存为新格式,这不是可选的。。。
公共void集合名(字符串名)
{
getFirstSample().setName(名称);
}
公共无效seAge(字符串年龄)
{
getFirstSample().setAge(年龄);
}
公共无效设置对象(自定义对象对象对象)
{
getFirstSample().setObj(obj);
}
}
公共类抽样数据
{
私有字符串名称;
私弦时代;
私有对象对象;
//访问器方法。。。
}
ConfigData中的façade setter方法将它们的值存储到列表的第一项


要提供保存的可能性,您应该删除
@xmltransive
,并为要保存的字段提供
公共
getter…

您可以将访问器方法委托给
配置数据
,并标记列表
@xmltransive
。我对JAXB映射不熟悉。在这种情况下,@xmltransive将如何提供帮助?能不能请你详细解释一下,感谢你抽出时间来解决我的问题。是的,你说得对。旧XML文件有一组示例数据。但是,除非我也复制了
configData
类中的属性,否则如何获取第一个
sampleData
对象中属性的值?我需要以新格式保存数据。我没有在第一个
SampleData
对象中获取属性值。旧的XML文件总是空的。谢谢!!!它起作用了。我将
@xmlement
注释应用于
configData
类中的所有setter