使用SimpleXML反序列化多个对象中的XML

时间:2013-11-22 11:04:25

标签: java android xml

我通过使用Simple

将多个对象附加到同一文件,从对象构建Android中的xml文件
<listOfBtDevices>
   <devices class="java.util.ArrayList">
   <BTDevice>
     <address>00:27:13:A3:2D:14</address>
     <bondState>NONE</bondState>
     <deviceType>LAPTOP</deviceType>
     <name>LTPH</name>
     <services>AUDIO CAPTURE NETWORKING OBJECT_TRANSFER RENDERING TELEPHONY</services>
     <rssi>-95</rssi>
   </BTDevice>
   <BTDevice>
     <address>00:27:13:A3:2D:14</address>
     <bondState>NONE</bondState>
     <deviceType>LAPTOP</deviceType>
     <name>LTPH</name>
     <services>AUDIO CAPTURE NETWORKING OBJECT_TRANSFER RENDERING TELEPHONY</services>
     <rssi>-95</rssi>
   </BTDevice>
   <BTDevice>
     <address>00:27:13:A3:2D:14</address>
     <bondState>NONE</bondState>
     <deviceType>LAPTOP</deviceType>
     <name>LTPH</name>
     <services>AUDIO CAPTURE NETWORKING OBJECT_TRANSFER RENDERING TELEPHONY</services>
     <rssi>-95</rssi>
   </BTDevice>
 </devices>
 <timestamp>22.11.2013_10.56.44</timestamp>
</listOfBtDevices>
<listOfBtDevices>
 <devices class="java.util.ArrayList">
    <BTDevice>
     <address>00:27:13:A3:2D:14</address>
     <bondState>NONE</bondState>
     <deviceType>LAPTOP</deviceType>
     <name>LTPH</name>
     <services>AUDIO CAPTURE NETWORKING OBJECT_TRANSFER RENDERING TELEPHONY</services>
     <rssi>-95</rssi>
    </BTDevice>
  </devices>
  <timestamp>22.11.2013_10.56.50</timestamp>
</listOfBtDevices>

在上面的示例中,对象是ListOfBtDevices,它是(String)时间戳和BTDevice的ArrayList的复合。问题是我如何使用桌面计算机上的Simple或其他框架在多个ListOfBtDevice对象中反序列化它?

谢谢你,如果我犯了错误,我很抱歉,但我是JAVA的初学者。

1 个答案:

答案 0 :(得分:0)

首先,为了能够反序列化xml文件,它需要有一个单根节点。不像你的情况那么多。

你有:

<listOfBtDevices>
...
</listOfBtDevices>
<listOfBtDevices>
...
</listOfBtDevices>

应该是什么样的:

<root>
    <listOfBtDevices>
    ...
    </listOfBtDevices>
    <listOfBtDevices>
    ...
    </listOfBtDevices>
</root>

之后,您需要使用SimpleXStream等框架进行反序列化。我会推荐Simple用于您的目的,我将使用Simple:

给您一个基本的例子

要使用Simple将XML反序列化为对象,您必须创建与xml具有相同结构的模型类。您将使用@Element或@Attribute等注释描述对象如何映射到XML。在你的情况下,它看起来像这样:

首先,您需要一个与您的根节点对应的类:

// The name you enter here is how the root node is called in your xml
@Root(name = "root")
public class BluetoothDeviceListContainer {

    // It contains a List, inline is set to true because the list items are directly inside the root node, each entry is called "listOfBtDevices"
    @ElementList(entry = "listOfBtDevices", inline = true) 
    List<BluetoothDeviceList> bluetoothDeviceList;

}

在你用类完全描述你的xml之前,你继续这样做。接下来,您将创建一个类BluetoothDeviceList,它对应于“listOfBtDevices”节点,并输入包含的元素和属性以及此类等。

完成后,您可以像这样反序列化xml:

Serializer serializer = new Persister();
BluetoothDeviceListContainer container = serializer.read(BluetoothDeviceListContainer.class, xmlAsString);

添加一些getter后,如果你需要setter到你的模型类,你可以访问所有反序列化的属性,如下所示:

BluetoothDeviceList list = container.get(0);
...

Here您可以找到Simple和here其他一些示例的完整教程。