2016-01-11 12 views
0

Так что я POJO который выглядит следующим образом:Преобразование XML в объект Java с общим именем узла и свойством в атрибуте?

public class ShippingAddress 
{ 
    private String name; 
    private String address; 
    private String city; 
    private String state; 
    private String zip; 

    //All the getters and setters 
} 

XML, входя, однако, выглядит следующим образом:

<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> 

Я обычно использую XStream для XML разбора, но я в тупик на этом. Будет ли решение использовать JAXB или какой-либо другой синтаксический анализатор XML? Или это, вероятно, будет иметь просто уродливое решение, создающее массив объектов «Data», а затем прокручивая их для создания моего полезного POJO?

Спасибо!

+0

Вскоре после того, как я отправил это, я нашел этот вопрос [ссылка] (http://stackoverflow.com/questions/34206426/xstream-and-parse-xml-attributes), который я думаю, что может обеспечить решение, которое я я ищу. –

ответ

0

Я думаю, 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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^