2010-11-02 29 views
11

¿Cómo convertir la lista de objetos a documentos XML utilizando XStream?Cómo convertir listas de objetos a documentos XML usando XStream

y cómo deserializarlo de nuevo?

Esta es mi xml

<?xml version="1.0" encoding="UTF-8"?> 
<persons> 
<person> 
    <fullname>Guilherme</fullname> 
    <age>10</age> 
    <address>address,address,address,address,</address> 
</person> 
<person> 
    <fullname>Guilherme</fullname> 
    <age>10</age> 
    <address>address,address,address,address,</address> 
</person> 
</persons> 

frijol persona contiene 3 campos de cómo convertir de nuevo a la lista de la haba usando convertidores personalizados?

Respuesta

20

Usted no necesariamente necesita un CustomConverter.

Se necesita una clase que contenga la lista:

public class PersonList { 

    private List<Person> list; 

    public PersonList(){ 
     list = new ArrayList<Person>(); 
    } 

    public void add(Person p){ 
     list.add(p); 
    } 
} 

serializar la lista a XML:

XStream xstream = new XStream(); 
    xstream.alias("person", Person.class); 
    xstream.alias("persons", PersonList.class); 
    xstream.addImplicitCollection(PersonList.class, "list"); 

    PersonList list = new PersonList(); 
    list.add(new Person("ABC",12,"address")); 
    list.add(new Person("XYZ",20,"address2")); 

    String xml = xstream.toXML(list); 

Para deserialise xml a una lista de objetos de la persona:

String xml = "<persons><person>...</person></persons>"; 
    PersonList pList = (PersonList)xstream.fromXML(xml); 
+0

Gracias b ut aquí en mi caso solo estoy deserializando, necesito escribir mi propio convertidor, estoy confundido por la conversión de la lista –

+0

Probablemente deberías mostrarnos tu clase de lista. – dogbane

+0

en su ejemplo me sale un error: "No campo" lista "para la recolección implícita" –

1

Cargar XML

public static Object Load(String xmlPath) throws Exception 
{ 
    File FileIn = new File(xmlPath); 
    if(FileIn.exists()) { 
     //Initialise Doc 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document Doc = builder.parse(FileIn); 

     //Initialise XPath 
     XPathFactory xPathFactory = XPathFactory.newInstance(); 
     XPath xpath = xPathFactory.newXPath(); 

     String objectClassLocation = xpath.evaluate("/object/@class",Doc); 
     Object ObjType; 

     //Create List of attributes for the Student 
     XPathExpression xpathExpression = xpath.compile("/object/*"); 
     NodeList ObjTypeAttributes = (NodeList)xpathExpression.evaluate(Doc, XPathConstants.NODESET); 

     ObjType = CreateObject(ObjTypeAttributes, objectClassLocation); 
     return ObjType; 
    } 
    return null; 
} 

Crear objeto

public static Object CreateObject(NodeList ObjectAttributes, String Location) throws Exception 
{ 
    Class ClassName = Class.forName(Location); 
    Object object = ClassName.newInstance(); 
    Field[] fields = ClassName.getFields(); 

    for(int x = 0; x < fields.length;x++) 
    { 
     for(int y = 0; y<ObjectAttributes.getLength(); y++) 
     { 
      if(!(ObjectAttributes.item(y) instanceof Text)) { 
       String check = ObjectAttributes.item(y).getAttributes().item(0).getNodeValue(); 

       if(fields[x].getName().equals(check)) 
       { 
        Field curField = ClassName.getField(fields[x].getName()); 
        if(ObjectAttributes.item(y).getAttributes().getLength() < 2) { 

         curField.set(object,CreateList(ObjectAttributes.item(y).getChildNodes())); 
        } 
        else { 

         curField.set(object,ObjectAttributes.item(y).getAttributes().item(1).getNodeValue()); 
        } 

       } 

      } 
     } 

    } 
    return object; 

} 

Crear una lista (sólo se utiliza si XML tiene un objeto de objetos)

public static ArrayList CreateList(NodeList ArrayNodeList) throws Exception 
{ 
    ArrayList List = new ArrayList(); 

    for(int x = 0; x < ArrayNodeList.getLength();x++) 
    { 
     if(!(ArrayNodeList.item(x) instanceof Text)) { 
      Node curNode = ArrayNodeList.item(x); 

      NodeList att = curNode.getChildNodes(); 
      String Location = ArrayNodeList.item(x).getAttributes().item(0).getNodeValue(); 
      Object newOne = CreateObject(att, Location); 
      List.add(newOne); 

     } 
    } 
    return List; 
} 

ejemplo XML Solía ​​

<?xml version="1.0" encoding="UTF-8"?> 
<object class="Example.Rps"> 
<field name="Representatives"> 
<object class="Example.Rep"> 
    <field name="RepID" value="888225462"/> 
    <field name="Surname" value="Johnson"/> 
    <field name="Name" value="Dave"/> 
    <field name="Clients"> 
     <object class="Example.Client"> 
      <field name="ClientName" value="Cipla"/> 
      <field name="State" value="New York"/> 
      <field name="grade" value="A"/> 
     </object> 
     <object class="Example.Client"> 
      <field name="ClientName" value="Pharmco"/> 
      <field name="State" value="Iowa"/> 
      <field name="grade" value="B"/> 
     </object> 
    </field> 
</object> 
    <object class="Example.Rep"> 
     <field name="RepID" value="888225462"/> 
     <field name="Surname" value="Dickson"/> 
     <field name="Name" value="Ben"/> 
     <field name="Clients"> 
      <object class="Example.Client"> 
       <field name="ClientName" value="XYZ"/> 
       <field name="State" value="New Mexico"/> 
       <field name="grade" value="A"/> 
      </object> 
      <object class="Example.Client"> 
       <field name="ClientName" value="Pharmco"/> 
       <field name="State" value="Ohio"/> 
       <field name="grade" value="c"/> 
      </object> 
     </field> 
    </object> 
</field> 
</object>