XML(可扩展标记语言,Extensible Markup Language)是一种用于描述数据的标记语言。它是一个W3C(World Wide Web Consortium)推荐的标准,用于存储和传输数据,具有可扩展性、平台无关性和自描述性。XML 由标签组成,这些标签可以嵌套,形成层次结构。XML 的主要用途包括配置文件、数据交换格式、文档存储等。
一个 XML 文档通常包含以下几个部分:
以下是一个示例 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:
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(); } } }
读取 XML:
使用 Python 的 ElementTree 模块可以方便地读取 XML 文档。
ElementTree
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