Java自带的工具包java.xml提供了多种方法如:DOM解析、SAX解析和StAX解析,这三种经典的方式。

一、DOM解析

DOM分析是在内存中读取XML文件,形成“对象树”,每一个元素、属性、文字等都会成为一个节点,然后可以随意添加、删除和检查这些节点。

此外,DOM分析还可以支持XML文档中的任何复杂级操作,包括修改XML内容和结构。但如果XML文件过大,DOM分析就会占用大量的内存。

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; try {    File inputFile = new File("input.txt");    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");    System.out.println("----------------------------");        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());       }    } } catch (Exception e) {    e.printStackTrace(); }

二、SAX解析

SAX分析是一种基于事件的分析方法,不需要将XML文件加载到内存中。而是一边扫描一边分析,适合大型文件的分析。

但SAX分析只能进行只读操作,不支持写入操作。另外,它不保存XML文档的状态,一旦开始分析,就无法追溯。

import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; public class ReadXMLFile {     public static void main(String argv[]) {         try {             SAXParserFactory factory = SAXParserFactory.newInstance();             SAXParser saxParser = factory.newSAXParser();             DefaultHandler handler = new DefaultHandler() {                 boolean bfname = false;                 boolean bsalary = false;                 public void startElement(String uri, String localName, String qName,                                           Attributes attributes) throws SAXException {                     if (qName.equalsIgnoreCase("FIRSTNAME")) {                         bfname = true;                     }                     if (qName.equalsIgnoreCase("SALARY")) {                         bsalary = true;                     }                 }             };             saxParser.parse("c:\file.xml", handler);         } catch (ParserConfigurationException | SAXException | IOException e) {             e.printStackTrace();         }     } }

三、StAX解析

StAX提供了一种基于流的XML分析方法,它允许程序员在分析过程中决定分析这些数据,这使得它在处理大量数据时更有效率。

API解析提供了两种API解析。:用于随机访问的CursorAPI,用于处理XML事件的EventIteratorAPI。

import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.FileNotFoundException; import java.io.FileReader; public class StaxParser {     public static void main(String[] args) {         boolean bFirstName = false;         boolean bLastName = false;         boolean bNickName = false;         try {             XMLInputFactory factory = XMLInputFactory.newInstance();             XMLStreamReader reader =                     factory.createXMLStreamReader(new FileReader("C:\file.xml"));             while(reader.hasNext()){                 int event = reader.next();                 switch(event){                     case XMLStreamConstants.START_ELEMENT:                         if ("firstname".equals(reader.getLocalName())){                             bFirstName = true;                         } else if ("lastname".equals(reader.getLocalName())){                             bLastName = true;                         } else if ("nickname".equals(reader.getLocalName())){                             bNickName = true;                         }                         break;                     case XMLStreamConstants.CHARACTERS:                         if(bFirstName){                             System.out.println("First Name: " +                                     reader.getText());                             bFirstName = false;                         } else if(bLastName){                             System.out.println("Last Name: " +                                     reader.getText());                             bLastName = false;                         } else if(bNickName){                             System.out.println("Nick Name: " +                                     reader.getText());                             bNickName = false;                         }                         break;                     case XMLStreamConstants.END_ELEMENT:                         break;                 }             }         } catch (Exception e) {             e.printStackTrace();         }     } }