2017-09-04 1 views
0

XML 문자열을 Object로 구문 분석해야합니다. type 속성에 존재하는 값의 유형을 나타냅니다루트 아래에있는 여러 요소가있는 복잡한 XML 속성 - JAXB를 구문 분석하고 객체 모델을 만듭니다.

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(); 
      } 

     } 
    } 

이 속성을 동일

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

구문 분석 코드 구현

나라 클래스 아래의 클래스와 XML 문자열 정보를 찾아보세요. 예를 들어, 1은 String, 2는 int, 3은 목록을 나타냅니다.

위의 XML 문자열을 Java Object에 매핑하는 솔루션을 누구든지 알려 주실 수 있습니까?

답변

0

당신은 아래와 같은 JAXB 뭔가를 사용하여 자바 객체에 비 정렬 화 시도 할 수 있습니다 :

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를) 답장을 보내 감사합니다, 실제 프로그램에 로그인 해 보았습니다. 그러나 클래스 나라에 대해 명확하지 않습니다. 작성한 방법에 대한 입력을 도와 주시겠습니까? 실제 클래스 구현으로 업데이트 된 질문을하시기 바랍니다. –