2015-05-07 2 views
1

Я использую Xstream libray для разбора xml, но имею EXception: com.thoughtworks.xstream.converters.ConversionException: название элемента типа com.mycontacts.model.explain32.Title32 не определено как поле в типа java.lang.Objectанализировать XML на POJO с помощью библиотеки xStream

explain32.xml

<?xml version="1.0" encoding="UTF-8"?> 
<explain> 

<data> 
<title name="123"/> 
</data> 

<data> 
<title name="234"/> 
</data> 

</explain> 

Java Bean:

public class ExplainXmlBody32 { 
    private List<ExplainXmlData32> data = new ArrayList<ExplainXmlData32>(); 
} 

public class ExplainXmlData32 { 
    private Title32 title; 
} 
public class Title32 { 
    String name; 
} 

, и я разбора XML, такие как:

private void parseXML_explain32(){ 
     try{ 
      String filePath = Environment.getExternalStorageDirectory() + "/myxml/explain32.xml"; 
      String strXML = IOUtils.toString(new FileInputStream(new File(filePath)), "utf-8"); 
      tvShow.setText(strXML); 

      XStream xStream = new XStream(); 

      xStream.alias("explain", ExplainXmlBody32.class); 
      xStream.alias("data", ExplainXmlData32.class);   
      xStream.alias("title", Title32.class); 

//   xStream.aliasField("title", ExplainXmlData32.class, "title"); 
      xStream.aliasAttribute(Title32.class, "name", "name"); 

      xStream.addImplicitCollection(ExplainXmlBody32.class, "data"); 
      //   xStream.addImplicitCollection(ExplainXmlData32.class, "titles"); 

      //   XOAlias.configExplainXml(xStream); 

      ExplainXmlBody32 explain32 = (ExplainXmlBody32) xStream.fromXML(strXML); 

      System.out.println("explain32, size:" + explain32.getData().size()); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

инфо исключение:

com.thoughtworks.xstream.converters.ConversionException: Element title of type com.mycontacts.model.explain32.Title32 is not defined as field in type java.lang.Object 
---- Debugging information ---- 
class    : com.mycontacts.model.explain32.ExplainXmlBody32 
required-type  : java.lang.Object 
path    : /explain/data/title 
line number   : 5 

как улучшить свой код и решить эту проблему?

ответ

0

Попробуйте это. Изменен список ArrayList для списка. Также добавлено определение типов XML. Данные и объяснения необходимы, потому что они не создают имя класса и не делают его элементом, поэтому код не создает дополнительный тег.

[XmlRoot("explain")] 
 
public class ExplainXmlBody32 
 
{ 
 
    [XmlElement("data")] 
 
    private List<ExplainXmlData32> data = new List<ExplainXmlData32>(); 
 
} 
 

 
public class ExplainXmlData32 
 
{ 
 
    [XmlElement("title")] 
 
    private Title32 title; 
 
} 
 
public class Title32 
 
{ 
 
    [XmlAttribute("name")] 
 
    String name; 
 
}

+0

Прошу прощения, нет [XmlRoot («объяснять»)] в xStream и «private List data = new List ();" невозможно. – Qohen

0

Я нашел способ решить эту проблему.

изменение Java Bean:

public class ExplainXmlBody32 { 
    private List<ExplainXmlData32> data = new ArrayList<ExplainXmlData32>(); 
} 

к

public class ExplainXmlBody32 { 
    private List<ExplainXmlData32> datas = new ArrayList<ExplainXmlData32>(); 
} 

затем

в методе parseXML_explain32(): изменение

xStream.addImplicitCollection(ExplainXmlBody32.class, "data"); 

к

xStream.addImplicitCollection(ExplainXmlBody32.class, "datas"); 

все.