将XML转换为属性中具有公共节点名和属性的Java对象?
我有一个POJO,看起来像这样:将XML转换为属性中具有公共节点名和属性的Java对象?,java,xml,xml-parsing,jaxb,xstream,Java,Xml,Xml Parsing,Jaxb,Xstream,我有一个POJO,看起来像这样: public class ShippingAddress { private String name; private String address; private String city; private String state; private String zip; //All the getters and setters } <ShippingAddress> <Data
public class ShippingAddress
{
private String name;
private String address;
private String city;
private String state;
private String zip;
//All the getters and setters
}
<ShippingAddress>
<Data Name="Name">John Doe</Data>
<Data Name="Address">123 Main Street</Data>
<Data Name="City">Anytown</Data>
<Data Name="State">AK</Data>
<Data Name="Zip">98765</Data>
</ShippingAddress>
但是,引入的XML如下所示:
public class ShippingAddress
{
private String name;
private String address;
private String city;
private String state;
private String zip;
//All the getters and setters
}
<ShippingAddress>
<Data Name="Name">John Doe</Data>
<Data Name="Address">123 Main Street</Data>
<Data Name="City">Anytown</Data>
<Data Name="State">AK</Data>
<Data Name="Zip">98765</Data>
</ShippingAddress>
无名氏
大街123号
任何城镇
AK
98765
我通常使用XStream进行XML解析,但这一点让我感到困惑。有没有使用JAXB或其他XML解析器的解决方案?或者这可能只是一个丑陋的解决方案,创建一个“数据”对象数组,然后循环通过它们来创建有用的POJO
谢谢 我想VTD-XML可能会对您有所帮助。下面是代码,我没有添加空检查和东西,但它应该能够实现您试图得到的。希望这有帮助
import java.io.File;
import java.io.FileInputStream;
import com.ximpleware.AutoPilot;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;
public class ParseXML {
private VTDGen vg;
private VTDNav vn;
private File f;
private FileInputStream fis;
public void parseFile(String inputfile){
try {
f = new File(inputfile);
fis = new FileInputStream(inputfile);
}catch(Exception e){
e.printStackTrace();
return;
}
initialize();
if(vg!=null)
parse();
}
private void initialize(){
try{
byte[] ba = new byte[(int)f.length()];
fis.read(ba);
vg = new VTDGen();
vg.setDoc(ba);
vg.parse(false);
vn = vg.getNav();
}catch(Exception e){}
}
private void parse(){
vn.push();
AutoPilot ap = new AutoPilot();
ap.bind(vn);
ap.resetXPath();
try{
ap.selectXPath("//ShippingAddress");
while(ap.evalXPath()!=-1)
loadData();
}catch(Exception e){}
vn.pop();
}
private void loadData(){
vn.push();
AutoPilot ap = new AutoPilot();
ap.bind(vn);
try{
ShippingAddress sd = new ShippingAddress();
ap.selectElement("*");
while(ap.iterate()){
//checking if current child element is Data
if(vn.toRawString(vn.getCurrentIndex()).trim().equalsIgnoreCase("Data")){
String attributeValue = "";
int i = vn.getAttrVal("Name");
if(i != -1)
attributeValue = vn.toString(i).trim();
String elementValue = vn.toNormalizedString(vn.getText());
if(attributeValue.trim().equals("Name")){
sd.setName(elementValue);
}else if(attributeValue.trim().equals("Address")){
sd.setAddress(elementValue);
}else if(attributeValue.trim().equals("City")){
sd.setCity(elementValue);
}else if(attributeValue.trim().equals("State")){
sd.setState(elementValue);
}else if(attributeValue.trim().equals("Zip")){
sd.setZip(elementValue);
}
}
}
//Add code/logic to save the newly created ShippingAddress sd object
}catch(Exception e){}
vn.pop();
}
}
在我发布这篇文章后不久,我发现了这个问题,我认为它可能提供我正在寻找的解决方案。