Java XML 解析教程:DOM 和 SAX 方法详解
Java 提供了多种解析 XML 的方式,其中常用的有两种:DOM 和 SAX。
- DOM 解析XML
DOM (Document Object Model) 解析方式是最常用的解析 XML 的方法之一,它将整个 XML 文档解析为一个树形结构,可以方便地对 XML 文档进行增、删、改、查等操作。
DOM 解析 XML 的步骤如下:
-
创建 DocumentBuilderFactory 对象,用于创建 DocumentBuilder 对象。
-
创建 DocumentBuilder 对象,用于解析 XML 文档,并返回一个 Document 对象。
-
通过 Document 对象访问 XML 文档中的元素。
示例代码:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DomParserExample {
public static void main(String[] args) {
try {
// 1. 创建 DocumentBuilderFactory 对象
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
// 2. 创建 DocumentBuilder 对象
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
// 3. 解析 XML 文档并返回一个 Document 对象
Document doc = dBuilder.parse('employees.xml');
// 获取 XML 文档中的元素
NodeList nodeList = doc.getElementsByTagName('employee');
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
String id = element.getAttribute('id');
String firstName = element.getElementsByTagName('firstName').item(0).getTextContent();
String lastName = element.getElementsByTagName('lastName').item(0).getTextContent();
String salary = element.getElementsByTagName('salary').item(0).getTextContent();
System.out.println('Employee ID: ' + id);
System.out.println('First Name: ' + firstName);
System.out.println('Last Name: ' + lastName);
System.out.println('Salary: ' + salary);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- SAX 解析XML
SAX (Simple API for XML) 解析方式是基于事件驱动的解析方法,它逐行读取 XML 文档,当遇到 XML 文档的节点时触发事件,可以通过实现相应的事件处理器来对事件进行处理。
SAX 解析 XML 的步骤如下:
-
创建 SAXParserFactory 对象,用于创建 SAXParser 对象。
-
创建 SAXParser 对象,用于解析 XML 文档。
-
实现 DefaultHandler 接口,并重写相应的方法来处理 XML 文档中的事件。
示例代码:
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParserExample {
public static void main(String[] args) {
try {
// 1. 创建 SAXParserFactory 对象
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2. 创建 SAXParser 对象
SAXParser saxParser = factory.newSAXParser();
// 3. 解析 XML 文档并设置事件处理器
saxParser.parse(new File('employees.xml'), new EmployeeHandler());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class EmployeeHandler extends DefaultHandler {
boolean bFirstName = false;
boolean bLastName = false;
boolean bSalary = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase('employee')) {
String id = attributes.getValue('id');
System.out.println('Employee ID: ' + id);
} else if (qName.equalsIgnoreCase('firstName')) {
bFirstName = true;
} else if (qName.equalsIgnoreCase('lastName')) {
bLastName = true;
} else if (qName.equalsIgnoreCase('salary')) {
bSalary = true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (bFirstName) {
System.out.println('First Name: ' + new String(ch, start, length));
bFirstName = false;
} else if (bLastName) {
System.out.println('Last Name: ' + new String(ch, start, length));
bLastName = false;
} else if (bSalary) {
System.out.println('Salary: ' + new String(ch, start, length));
bSalary = false;
}
}
}
原文地址: https://www.cveoy.top/t/topic/luNE 著作权归作者所有。请勿转载和采集!