【问题标题】:How to convert List of Object to XML doc using XStream如何使用 XStream 将对象列表转换为 XML 文档
【发布时间】:2011-05-03 21:17:50
【问题描述】:

如何使用 XStream 将对象列表转换为 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 包含 3 个字段,如何使用自定义转换器将其转换回 Bean List ?

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

    您不一定需要 CustomConverter。

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

    public class PersonList {
    
        private List<Person> list;
    
        public PersonList(){
            list = new ArrayList<Person>();
        }
    
        public void add(Person p){
            list.add(p);
        }
    }
    

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

    要将 xml 反序列化为人员对象列表:

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

    【讨论】:

    • 谢谢,但在这里我只是反序列化,我需要编写自己的转换器,我对列表转换感到困惑
    • 在你的例子中我得到一个错误:“没有字段“列表”用于隐式集合”
    • @Marci-man 请注意xstream.addImplicitCollection(PersonList.class, "list");中的list必须是PersonList的集合名称,即list
    • Dobane,xstream.alias 调用的目的是什么?是否可以用作通用对象序列化程序(类似于接受对象并将其保存为 XML 等的服务)?
    【解决方案2】:

    只需使用 std toXml 和 fromXml 方法,请参阅http://en.wikipedia.org/wiki/XStream 示例。另请参阅http://x-stream.github.io/converters.html,了解默认转换的工作原理。

    好的,因此默认转换器在您的情况下将无法正常工作。您需要遵循:

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

    【讨论】:

    • 谢谢,我已经更新了问题
    【解决方案3】:

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

    创建对象

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

    创建列表(仅当 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 示例

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多