Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
将XML转换为属性中具有公共节点名和属性的Java对象?_Java_Xml_Xml Parsing_Jaxb_Xstream - Fatal编程技术网

将XML转换为属性中具有公共节点名和属性的Java对象?

将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

我有一个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 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();
    }
}

在我发布这篇文章后不久,我发现了这个问题,我认为它可能提供我正在寻找的解决方案。