📜  Andorid 使用DOM解析XML(1)

📅  最后修改于: 2023-12-03 14:39:06.794000             🧑  作者: Mango

Android使用DOM解析XML

在Android开发中,我们经常需要解析XML数据。DOM解析器是一种基于树形结构的解析方式,可以将一个XML文档读入内存中并构建一个DOM树,开发者可以在内存中对整个XML文档进行操作。

导入依赖

在需要使用DOM解析器时,需要导入相关依赖:

implementation 'javax.xml.parsers:jaxp-api:1.4.5'
implementation 'org.apache.harmony:xml:2.0.2'
解析XML

下面我们通过一个简单的例子来介绍如何使用DOM解析器解析XML数据。

我们有一个名为person.xml的文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="1">
        <name>张三</name>
        <gender>男</gender>
        <age>18</age>
    </person>
    <person id="2">
        <name>李四</name>
        <gender>女</gender>
        <age>20</age>
    </person>
</persons>

我们的目标是将这个XML文件解析成一个Person对象列表。首先,我们需要定义Person类:

public class Person {
    private int id;
    private String name;
    private String gender;
    private int age;

    public Person(int id, String name, String gender, int age) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    // 省略getter和setter方法
}

然后,我们可以编写一个工具类XmlUtils来实现XML的解析:

public class XmlUtils {
    public static List<Person> parseXML(String xml) throws Exception {
        // 创建一个DocumentBuilderFactory实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        // 创建一个DocumentBuilder实例
        DocumentBuilder builder = factory.newDocumentBuilder();

        // 将字符串转换为输入流
        InputStream is = new ByteArrayInputStream(xml.getBytes());

        // 解析XML文件,获取Document对象
        Document doc = builder.parse(is);

        // 获取根节点
        Element root = doc.getDocumentElement();

        // 获取所有person节点
        NodeList persons = root.getElementsByTagName("person");

        List<Person> personList = new ArrayList<>();
        for (int i = 0; i < persons.getLength(); i++) {
            Element element = (Element) persons.item(i);

            // 获取属性id的值
            int id = Integer.parseInt(element.getAttribute("id"));

            // 获取子节点
            NodeList children = element.getChildNodes();

            String name = "";
            String gender = "";
            int age = 0;

            // 遍历子节点,获取name、gender和age的值
            for (int j = 0; j < children.getLength(); j++) {
                Node child = children.item(j);

                String nodeName = child.getNodeName();
                String nodeValue = child.getTextContent();

                switch (nodeName) {
                    case "name":
                        name = nodeValue;
                        break;
                    case "gender":
                        gender = nodeValue;
                        break;
                    case "age":
                        age = Integer.parseInt(nodeValue);
                        break;
                }
            }

            // 创建Person对象,并添加到列表
            Person person = new Person(id, name, gender, age);
            personList.add(person);
        }

        return personList;
    }
}

在上面的代码中,我们使用了DocumentBuilderFactoryDocumentBuilder来创建一个Document对象,然后通过遍历节点树的方式来获取XML文档中的数据,并将其封装成Person对象。

使用示例

下面是一个使用示例:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<persons>\n" +
        "    <person id=\"1\">\n" +
        "        <name>张三</name>\n" +
        "        <gender>男</gender>\n" +
        "        <age>18</age>\n" +
        "    </person>\n" +
        "    <person id=\"2\">\n" +
        "        <name>李四</name>\n" +
        "        <gender>女</gender>\n" +
        "        <age>20</age>\n" +
        "    </person>\n" +
        "</persons>";
try {
    List<Person> personList = XmlUtils.parseXML(xml);
    for (Person person : personList) {
        Log.d("MainActivity", person.getName());
    }
} catch (Exception e) {
    e.printStackTrace();
}

我们将XML数据传递给XmlUtils.parseXML()方法,得到一个Person对象列表,然后遍历输出每个Person对象的名称。

总结

DOM解析器是一种非常常用的XML解析方式,在Android开发中也经常被使用到。通过本文的介绍,相信读者已经对DOM解析器有了基本的了解,可以在开发中使用它来解析XML数据了。