XML 简介及用法详解


XML 简介

XML(可扩展标记语言,Extensible Markup Language)是一种用于描述数据的标记语言。它是一个W3C(World Wide Web Consortium)推荐的标准,用于存储和传输数据,具有可扩展性、平台无关性和自描述性。XML 由标签组成,这些标签可以嵌套,形成层次结构。XML 的主要用途包括配置文件、数据交换格式、文档存储等。

XML 的基本结构

一个 XML 文档通常包含以下几个部分:

  1. XML 声明:定义 XML 版本和编码方式(可选)。
  2. 根元素:每个 XML 文档必须有且只有一个根元素。
  3. 元素:XML 的基本结构单元,元素可以包含其他元素、属性和文本。
  4. 属性:元素可以有属性,属性是元素的附加信息。

以下是一个示例 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

XML 的基本用法

1. 定义和解析 XML

定义 XML

XML 由元素组成,每个元素使用开始标签和结束标签包围内容。元素可以包含子元素、属性和文本。

<person>
    <name>John Doe</name>
    <age>30</age>
    <email>john.doe@example.com</email>
</person>

解析 XML

解析 XML 有多种方法,常见的方法包括 DOM(文档对象模型)、SAX(简单 API for XML)和 StAX(Streaming API for XML)。以下是使用不同方法解析 XML 的示例。

DOM 解析

DOM 解析器将整个 XML 文档加载到内存中,形成一个树形结构,方便对文档进行随机访问和操作。以下是使用 Java 的 DOM 解析器解析 XML 的示例。

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class DOMParserExample {
    public static void main(String[] args) {
        try {
            File inputFile = new File("input.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();
            System.out.println("Root element: " + doc.getDocumentElement().getNodeName());
            NodeList nList = doc.getElementsByTagName("person");
            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                System.out.println("\nCurrent Element: " + nNode.getNodeName());
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    System.out.println("Name: " + eElement.getElementsByTagName("name").item(0).getTextContent());
                    System.out.println("Age: " + eElement.getElementsByTagName("age").item(0).getTextContent());
                    System.out.println("Email: " + eElement.getElementsByTagName("email").item(0).getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

SAX 解析

SAX 解析器逐行读取 XML 文档,触发相应的事件(如开始元素、结束元素、字符数据等),适合处理大文件。以下是使用 Java 的 SAX 解析器解析 XML 的示例。

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SAXParserExample {
    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            DefaultHandler handler = new DefaultHandler() {
                boolean bName = false;
                boolean bAge = false;
                boolean bEmail = false;

                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    if (qName.equalsIgnoreCase("name")) {
                        bName = true;
                    }
                    if (qName.equalsIgnoreCase("age")) {
                        bAge = true;
                    }
                    if (qName.equalsIgnoreCase("email")) {
                        bEmail = true;
                    }
                }

                public void endElement(String uri, String localName, String qName) throws SAXException {
                }

                public void characters(char ch[], int start, int length) throws SAXException {
                    if (bName) {
                        System.out.println("Name: " + new String(ch, start, length));
                        bName = false;
                    }
                    if (bAge) {
                        System.out.println("Age: " + new String(ch, start, length));
                        bAge = false;
                    }
                    if (bEmail) {
                        System.out.println("Email: " + new String(ch, start, length));
                        bEmail = false;
                    }
                }
            };
            saxParser.parse("input.xml", handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. XML 的读取和写入

读取 XML

使用 Python 的 ElementTree 模块可以方便地读取 XML 文档。

import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')
root = tree.getroot()

for child in root:
    print(child.tag, child.attrib)
    for subchild in child:
        print(subchild.tag, subchild.text)

写入 XML

使用 Python 的 ElementTree 模块可以方便地创建和写入 XML 文档。

import xml.etree.ElementTree as ET

root = ET.Element("root")
child = ET.SubElement(root, "child")
child.text = "This is a child element"
tree = ET.ElementTree(root)
tree.write("output.xml")

结论

XML 是一种强大且灵活的数据表示和传输格式,广泛应用于各种领域。通过掌握 XML 的基本结构和常用的解析方法,开发人员可以高效地处理和操作 XML 数据。根据具体的应用场景选择合适的解析器(如 DOM、SAX 或 StAX)能够更好地满足性能和内存需求。XML 的读取和写入操作在现代编程语言中通常都有良好的库支持,使得 XML 的使用更加方便和高效。


原文链接:codingdict.net