如何使用XStream将对象列表转换为XML文档?

时间:2021-04-24 21:46:43

How to convert List of Object to XML doc using XStream ?

如何使用XStream将对象列表转换为XML doc ?

and how to deserialize it back ?

如何反序列化它呢?

This is my xml

这是我的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>

Person bean contains 3 fields how to convert back it to Bean List using custom converters ?

Person bean包含三个字段如何使用自定义转换器将其转换回bean列表?

3 个解决方案

#1


21  

You don't necessarily need a CustomConverter.

您不需要定制转换器。

You need a class to hold your list:

你需要一个类来保存你的列表:

public class PersonList {

    private List<Person> list;

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

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

To serialise the list to XML:

将列表序列化为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);

To deserialise xml to a list of person objects:

将xml反序列化为person对象列表:

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

#2


4  

Just use the std toXml and fromXml methods, see http://en.wikipedia.org/wiki/XStream for an example. Also see http://x-stream.github.io/converters.html on how the default conversions work.

只需使用std toXml和fromXml方法,请参见http://en.wikipedia.org/wiki/XStream的示例。也看到http://x-stream.github.io/converters。关于默认转换如何工作的html。

OK, so the default converters won't quite work in your case. You need to follow:

默认的转换器在你的例子中不太适用。你需要遵循:

http://x-stream.github.io/converter-tutorial.html

http://x-stream.github.io/converter-tutorial.html

#3


1  

Load XML

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

Create Object

创建对象

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;

}

Create list (Only used if xml has an object of objects)

创建列表(仅在xml有对象对象的情况下使用)

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

XML example I used

我使用的XML例子

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

#1


21  

You don't necessarily need a CustomConverter.

您不需要定制转换器。

You need a class to hold your list:

你需要一个类来保存你的列表:

public class PersonList {

    private List<Person> list;

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

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

To serialise the list to XML:

将列表序列化为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);

To deserialise xml to a list of person objects:

将xml反序列化为person对象列表:

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

#2


4  

Just use the std toXml and fromXml methods, see http://en.wikipedia.org/wiki/XStream for an example. Also see http://x-stream.github.io/converters.html on how the default conversions work.

只需使用std toXml和fromXml方法,请参见http://en.wikipedia.org/wiki/XStream的示例。也看到http://x-stream.github.io/converters。关于默认转换如何工作的html。

OK, so the default converters won't quite work in your case. You need to follow:

默认的转换器在你的例子中不太适用。你需要遵循:

http://x-stream.github.io/converter-tutorial.html

http://x-stream.github.io/converter-tutorial.html

#3


1  

Load XML

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

Create Object

创建对象

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;

}

Create list (Only used if xml has an object of objects)

创建列表(仅在xml有对象对象的情况下使用)

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

XML example I used

我使用的XML例子

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