51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Java读取XML

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

一、DOM解析 {#title-1}

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解析 {#title-2}

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解析 {#title-3}

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();
        }
    }
}
赞(2)
未经允许不得转载:工具盒子 » Java读取XML