2017-09-04 1 views
0

XML文字列をObjectに解析する必要があります。ルートの下にある複数の要素で複雑なXML属性を解析する - JAXBおよびオブジェクトモデルを作成する

国type属性は、属性と等しいに存在する値のタイプを示すクラス

public class Country { 

    private String Country_Name; 
    private String Country_Capital; 
    private String Country_Foundation_Date; 
    private String Country_Continent; 
    private String Country_Population; 

    public String getCountry_Name() { 
     return Country_Name; 
    } 
    public void setCountry_Name(String country_Name) { 
     Country_Name = country_Name; 
    } 
    public String getCountry_Capital() { 
     return Country_Capital; 
    } 
    public void setCountry_Capital(String country_Capital) { 
     Country_Capital = country_Capital; 
    } 
    public String getCountry_Foundation_Date() { 
     return Country_Foundation_Date; 
    } 
    public void setCountry_Foundation_Date(String country_Foundation_Date) { 
     Country_Foundation_Date = country_Foundation_Date; 
    } 
    public String getCountry_Continent() { 
     return Country_Continent; 
    } 
    public void setCountry_Continent(String country_Continent) { 
     Country_Continent = country_Continent; 
    } 
    public String getCountry_Population() { 
     return Country_Population; 
    } 
    public void setCountry_Population(String country_Population) { 
     Country_Population = country_Population; 
    } 
} 

解析コードの実装

import java.io.StringReader; 

    import javax.xml.bind.JAXBContext; 
    import javax.xml.bind.JAXBElement; 
    import javax.xml.bind.Unmarshaller; 
    import javax.xml.transform.stream.StreamSource; 

    public class ParseXMLStringtoObject { 

     public static String getXMLString() { 

      StringBuilder returnString = new StringBuilder(); 
      returnString.append("<output xmlprop = \"somevalue\"> "); 
      returnString.append("<Country> "); 
      returnString.append("<Country_Name equals=\"Spain\" type=\"1\" /> "); 
      returnString.append("<Country_Capital equals = \"Madrid\" type=\"1\" /> "); 
      returnString.append("<Country_Foundation_Date equals=\"1469-10-19\" type=\"3\" /> "); 
      returnString.append("<Country_Continent equals=\"Europe\" type = \"1\" /> "); 
      returnString.append("<Country_Population equals=\"45\" type = \"2\" /> "); 
      returnString.append("</Country> "); 

      return returnString.toString(); 
     } 

     public static Object getObjectFromStringXml(Class<Country> country) 
       throws IllegalAccessException, InstantiationException { 
      Object obj = getObject(country.newInstance()); 
      try { 
       StringReader reader = new StringReader(getXMLString()); 
       JAXBContext context = JAXBContext.newInstance(country); 
       Unmarshaller jaxbUnmarshaller = context.createUnmarshaller(); 
       JAXBElement<?> root = jaxbUnmarshaller.unmarshal(new StreamSource(reader), country); 
       obj = root.getValue(); 
      } catch (Exception e) { 
       System.out.printf("Exception occoured while unmarshalling xml String to " + obj.getClass() +" Object", e); 
      } 
      return obj; 
     } 

     private static Object getObject(Object obj) { 
      if (obj instanceof Country) { 
       obj = (Country) obj; 
      } 
      return obj; 
     } 

     public static void main(String[] args) { 
      Country country = new Country(); 
      //Class<Country> countryObj = new Class<Country>(); // I don't know how to convert my Country object 
      //or don't know the input value to the getObjectFromStringXml method 


      ParseXMLStringtoObject parseXML = new ParseXMLStringtoObject(); 
      try{ 
//This is the place I have the doubt to call the parse method, regarding input    
Object obj = parseXML.getObjectFromStringXml(Class<Country> countryObj); 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

以下のクラスとXML文字列の詳細を見つけてください。たとえば、1は文字列を表し、2はintを表し、3はリストを表します。

上記のxml文字列をJavaオブジェクトにマップする解決策を誰にでも教えてもらえますか。

答えて

0

あなたは以下のようなJAXBのものを使用してJavaオブジェクトに非整列化しようとすることができます

public static Object getObjectFromStringXml(String xml, Class<Country> country) 
       throws IllegalAccessException, InstantiationException { 
      Object obj = getObject(country.newInstance()); 
      try { 
       StringReader reader = new StringReader(xml); 
       JAXBContext context = JAXBContext.newInstance(country); 
       Unmarshaller jaxbUnmarshaller = context.createUnmarshaller(); 
       JAXBElement<?> root = jaxbUnmarshaller.unmarshal(new StreamSource(
         reader), country); 
       obj = root.getValue(); 
      } catch (Exception e) { 
       log.info("Exception occoured while unmarshalling xml String to " + obj.getClass() +" Object", e); 
      } 
      return obj; 
     } 

     private static Object getObject(Object obj) { 
      if (obj instanceof Country) { 
       obj = (Country) obj; 
      } 
      return obj; 
     } 
+0

こんにちはArpan(@Arpan - https://stackoverflow.com/users/8561371/arpan)ご返信用 おかげで、私はあなたのログインを実際のプログラムに含めることを試みました。しかし、クラス国については明確ではありません。 あなたが書いた方法の入力を手伝ってもらえますか?実際のクラスの実装で更新された質問をしてください。 –

関連する問題