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>