java中如何读取xml文档

java中如何读取xml文档

Java中读取XML文档可以使用DOM解析、SAX解析、StAX解析、JDOM解析等方法。这些方法各有优缺点,适用于不同的使用场景。 例如,DOM解析适合处理小型XML文档,因其会将整个文档加载到内存中。SAX解析则适用于大型XML文档,因为它是基于事件驱动的,内存消耗较小。StAX解析允许程序员以更灵活的方式处理XML,是一种基于光标的解析方法。JDOM解析结合了DOM和SAX的优点,提供了更为简洁和易用的API。

一、DOM解析

DOM(Document Object Model)解析是一种常见的XML解析方式,它将整个XML文档加载到内存中,并将其表示为一个树结构。以下是DOM解析的详细步骤及代码示例:

1、引入必要的库

在使用DOM解析之前,需要确保引入了必要的库。Java标准库中已经包含了处理XML的库,因此不需要额外添加依赖。

javax.xml

javax.xml

1.0.0

2、加载XML文档

使用DocumentBuilderFactory和DocumentBuilder类来加载XML文档。

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.DocumentBuilder;

import org.w3c.dom.Document;

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());

} catch (Exception e) {

e.printStackTrace();

}

}

}

3、解析XML文档

解析XML文档的节点,并获取所需的数据。

import org.w3c.dom.NodeList;

import org.w3c.dom.Node;

import org.w3c.dom.Element;

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("student");

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("Student roll no : " + eElement.getAttribute("rollno"));

System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());

System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());

System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());

System.out.println("Marks : " + eElement.getElementsByTagName("marks").item(0).getTextContent());

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

二、SAX解析

SAX(Simple API for XML)是一种基于事件驱动的XML解析方法,它不会将整个文档加载到内存中,而是逐行读取并解析,适用于大型XML文档。

1、引入必要的库

同样,Java标准库中已经包含了SAX解析的库,不需要额外添加依赖。

2、实现DefaultHandler

需要实现DefaultHandler类,并覆盖其事件处理方法,如startElement、endElement和characters。

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class SAXHandler extends DefaultHandler {

boolean bFirstName = false;

boolean bLastName = false;

boolean bNickName = false;

boolean bMarks = false;

@Override

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

if (qName.equalsIgnoreCase("student")) {

String rollNo = attributes.getValue("rollno");

System.out.println("Roll No : " + rollNo);

} else if (qName.equalsIgnoreCase("firstname")) {

bFirstName = true;

} else if (qName.equalsIgnoreCase("lastname")) {

bLastName = true;

} else if (qName.equalsIgnoreCase("nickname")) {

bNickName = true;

} else if (qName.equalsIgnoreCase("marks")) {

bMarks = true;

}

}

@Override

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

System.out.println("End Element :" + qName);

}

@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 (bNickName) {

System.out.println("Nick Name: " + new String(ch, start, length));

bNickName = false;

} else if (bMarks) {

System.out.println("Marks: " + new String(ch, start, length));

bMarks = false;

}

}

}

3、解析XML文档

使用SAXParserFactory和SAXParser类来解析XML文档。

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();

SAXHandler handler = new SAXHandler();

saxParser.parse("input.xml", handler);

} catch (Exception e) {

e.printStackTrace();

}

}

}

三、StAX解析

StAX(Streaming API for XML)是一种基于光标的解析方法,允许程序员以更灵活的方式处理XML文档。它提供了两种模式:光标模式和事件模式。

1、引入必要的库

同样,Java标准库中已经包含了StAX解析的库,不需要额外添加依赖。

2、使用光标模式解析XML文档

光标模式通过XMLStreamReader类逐行读取XML文档。

import javax.xml.stream.XMLInputFactory;

import javax.xml.stream.XMLStreamReader;

import javax.xml.stream.events.XMLEvent;

import java.io.FileInputStream;

public class StAXCursorParserExample {

public static void main(String[] args) {

try {

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("input.xml"));

while (reader.hasNext()) {

int event = reader.next();

if (event == XMLEvent.START_ELEMENT) {

if ("student".equals(reader.getLocalName())) {

System.out.println("Roll No : " + reader.getAttributeValue(null, "rollno"));

} else if ("firstname".equals(reader.getLocalName())) {

System.out.println("First Name : " + reader.getElementText());

} else if ("lastname".equals(reader.getLocalName())) {

System.out.println("Last Name : " + reader.getElementText());

} else if ("nickname".equals(reader.getLocalName())) {

System.out.println("Nick Name : " + reader.getElementText());

} else if ("marks".equals(reader.getLocalName())) {

System.out.println("Marks : " + reader.getElementText());

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

3、使用事件模式解析XML文档

事件模式通过XMLEventReader类处理XML文档中的事件。

import javax.xml.stream.XMLInputFactory;

import javax.xml.stream.XMLEventReader;

import javax.xml.stream.events.XMLEvent;

import java.io.FileInputStream;

public class StAXEventParserExample {

public static void main(String[] args) {

try {

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLEventReader eventReader = factory.createXMLEventReader(new FileInputStream("input.xml"));

while (eventReader.hasNext()) {

XMLEvent event = eventReader.nextEvent();

if (event.isStartElement()) {

String localPart = event.asStartElement().getName().getLocalPart();

if ("student".equals(localPart)) {

System.out.println("Roll No : " + event.asStartElement().getAttributeByName(new QName("rollno")).getValue());

} else if ("firstname".equals(localPart)) {

event = eventReader.nextEvent();

System.out.println("First Name : " + event.asCharacters().getData());

} else if ("lastname".equals(localPart)) {

event = eventReader.nextEvent();

System.out.println("Last Name : " + event.asCharacters().getData());

} else if ("nickname".equals(localPart)) {

event = eventReader.nextEvent();

System.out.println("Nick Name : " + event.asCharacters().getData());

} else if ("marks".equals(localPart)) {

event = eventReader.nextEvent();

System.out.println("Marks : " + event.asCharacters().getData());

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

四、JDOM解析

JDOM是一个用于Java的XML解析库,结合了DOM和SAX的优点,提供了更为简洁和易用的API。

1、引入必要的库

需要添加JDOM的依赖。

org.jdom

jdom2

2.0.6

2、加载和解析XML文档

使用SAXBuilder类来加载和解析XML文档。

import org.jdom2.Document;

import org.jdom2.Element;

import org.jdom2.input.SAXBuilder;

import java.io.File;

import java.util.List;

public class JDOMParserExample {

public static void main(String[] args) {

try {

File inputFile = new File("input.xml");

SAXBuilder saxBuilder = new SAXBuilder();

Document document = saxBuilder.build(inputFile);

Element rootElement = document.getRootElement();

System.out.println("Root element : " + rootElement.getName());

List studentList = rootElement.getChildren();

for (Element student : studentList) {

System.out.println("nCurrent Element : " + student.getName());

System.out.println("Student roll no : " + student.getAttribute("rollno").getValue());

System.out.println("First Name : " + student.getChild("firstname").getText());

System.out.println("Last Name : " + student.getChild("lastname").getText());

System.out.println("Nick Name : " + student.getChild("nickname").getText());

System.out.println("Marks : " + student.getChild("marks").getText());

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

五、总结

在Java中读取XML文档有多种方法可供选择,每种方法都有其优点和适用的场景。

DOM解析:适用于小型XML文档,易于理解和使用,但会将整个文档加载到内存中,内存消耗较大。

SAX解析:适用于大型XML文档,基于事件驱动,内存消耗较小,但编程复杂度较高。

StAX解析:提供了光标模式和事件模式,灵活性较高,适用于需要高效读取和处理XML文档的场景。

JDOM解析:结合了DOM和SAX的优点,提供了更为简洁和易用的API,适用于需要快速开发和易于维护的项目。

根据具体需求选择合适的解析方法,可以更高效地处理XML文档。

相关问答FAQs:

1. 如何使用Java读取XML文档?Java提供了多种方式来读取XML文档。你可以使用DOM解析器、SAX解析器或者JAXB来实现。DOM解析器将整个XML文档加载到内存中,适用于小型文档;SAX解析器逐行读取XML文档,适用于大型文档;JAXB是Java Architecture for XML Binding的缩写,它将XML文档绑定到Java对象上,方便读取和操作。

2. 如何使用DOM解析器读取XML文档?使用DOM解析器读取XML文档的步骤如下:

创建一个DocumentBuilder对象。

使用DocumentBuilder对象的parse方法将XML文件加载到内存中,生成一个Document对象。

通过Document对象的方法,如getElementsByTagName获取XML文档中的节点。

遍历节点,获取节点的元素和属性值。

3. 如何使用SAX解析器读取XML文档?使用SAX解析器读取XML文档的步骤如下:

创建一个SAXParserFactory对象。

使用SAXParserFactory对象的newSAXParser方法创建一个SAXParser对象。

创建一个继承DefaultHandler的自定义处理器类。

重写自定义处理器类的startElement、endElement和characters方法,在这些方法中处理XML文档的节点。

使用SAXParser对象的parse方法,传入XML文件路径和自定义处理器对象,开始解析XML文档。

4. 有没有其他可以使用的Java库来读取XML文档?除了DOM解析器和SAX解析器,还有其他的Java库可以读取XML文档。例如,你可以使用JAXB库来将XML文档绑定到Java对象上,方便读取和操作。另外,还有一些第三方库,如JDOM和XOM,提供了更加简化和灵活的方式来读取XML文档。你可以根据自己的需求选择合适的库来进行XML文档的读取。

原创文章,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/271530

相关推荐

男人为什么常常变心?揭秘这3大真相!
365bet在线官网

男人为什么常常变心?揭秘这3大真相!

📅 07-13 👁️ 2377
TES大揭底 它的前身到底是什么?
天天365彩票软件官方下载3D

TES大揭底 它的前身到底是什么?

📅 07-16 👁️ 775
Black/黑色/#000000/#000十六进制颜色代码
天天365彩票软件官方下载3D

Black/黑色/#000000/#000十六进制颜色代码

📅 06-29 👁️ 2178
大妈的解释
天天365彩票软件官方下载3D

大妈的解释

📅 07-23 👁️ 5732
荣耀7和Mate7哪款好 荣耀7和Mate7区别对比【详解】
天天365彩票软件官方下载3D

荣耀7和Mate7哪款好 荣耀7和Mate7区别对比【详解】

📅 07-10 👁️ 5183
《赤壁赋》全文、注释、翻译和赏析
天天365彩票软件官方下载3D

《赤壁赋》全文、注释、翻译和赏析

📅 07-11 👁️ 1993