XML + 4种常见解析方式

XML(eXtensible Markup Language)是一种常用于存储和交换数据的标记语言。在Java中,有多种方式可以解析XML文档。以下是四种常见的XML解析方式:

1. **DOM解析(Document Object Model):**
   - **优点:** 完整的树形结构,方便对文档进行任何修改和操作。
   - **缺点:** 内存消耗较大,不适用于处理大型XML文件。

   ```java
   // 使用javax.xml.parsers 包中的 DocumentBuilder 来解析 XML
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document document = builder.parse(new File("example.xml"));
   ```

代码:

private static void domTest2() throws ParserConfigurationException, IOException, SAXException {
    try {
        // Load the XML file
        File xmlFile = new File("D:\\CodeAll\\code\\Exercies\\src\\huizhi\\xmltest\\StudentTable.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        org.w3c.dom.Document document = dBuilder.parse(xmlFile);
        document.getDocumentElement().normalize();

        // Get the root element
        org.w3c.dom.Element rootElement = document.getDocumentElement();

        // Get all student nodes
        NodeList studentList = rootElement.getElementsByTagName("student");

        for (int i = 0; i < studentList.getLength(); i++) {
            Node studentNode = studentList.item(i);
            if (studentNode.getNodeType() == Node.ELEMENT_NODE) {
                Element studentElement = (Element) studentNode;

                // Extract data from student node
                String name = studentElement.getElementsByTagName("name").item(0).getTextContent();
                String age = studentElement.getElementsByTagName("age").item(0).getTextContent();
                String grade = studentElement.getElementsByTagName("grade").item(0).getTextContent();
                String subject = studentElement.getElementsByTagName("subject").item(0).getTextContent();

                // Print extracted information
                System.out.println("Name: " + name);
                System.out.println("Age: " + age);
                System.out.println("Grade: " + grade);
                System.out.println("Subject: " + subject);
                System.out.println("------------------------");
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2. **SAX解析(Simple API for XML):**
   - **优点:** 逐行读取,适用于大型XML文件,内存消耗小。
   - **缺点:** 不支持文档的修改操作。

   ```java
   // 使用 org.xml.sax 包中的 SAXParser 来解析 XML
   SAXParserFactory factory = SAXParserFactory.newInstance();
   SAXParser parser = factory.newSAXParser();
   XMLHandler handler = new XMLHandler();
   parser.parse(new File("example.xml"), handler);
   ```

代码:

private static void saxTest() {
    try {
        // Create a SAXParserFactory
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        // Create a handler for SAX events
        DefaultHandler handler = new DefaultHandler() {
            boolean inStudent = false;
            boolean inName = false;
            boolean inAge = false;
            boolean inGrade = false;
            boolean inSubject = false;

            @Override
            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                if (qName.equalsIgnoreCase("student")) {
                    inStudent = true;
                } else if (qName.equalsIgnoreCase("name")) {
                    inName = true;
                } else if (qName.equalsIgnoreCase("age")) {
                    inAge = true;
                } else if (qName.equalsIgnoreCase("grade")) {
                    inGrade = true;
                } else if (qName.equalsIgnoreCase("subject")) {
                    inSubject = true;
                }
            }

            @Override
            public void characters(char[] ch, int start, int length) throws SAXException {
                if (inName) {
                    System.out.println("Name: " + new String(ch, start, length));
                } else if (inAge) {
                    System.out.println("Age: " + new String(ch, start, length));
                } else if (inGrade) {
                    System.out.println("Grade: " + new String(ch, start, length));
                } else if (inSubject) {
                    System.out.println("Subject: " + new String(ch, start, length));
                }
            }

            @Override
            public void endElement(String uri, String localName, String qName) throws SAXException {
                if (qName.equalsIgnoreCase("student")) {
                    inStudent = false;
                } else if (qName.equalsIgnoreCase("name")) {
                    inName = false;
                } else if (qName.equalsIgnoreCase("age")) {
                    inAge = false;
                } else if (qName.equalsIgnoreCase("grade")) {
                    inGrade = false;
                } else if (qName.equalsIgnoreCase("subject")) {
                    inSubject = false;
                }
            }
        };

        // Parse the XML file using the handler
        saxParser.parse(new File("D:\\CodeAll\\code\\Exercies\\src\\huizhi\\xmltest\\StudentTable.xml"), handler);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

3. **JDOM解析:**
   - **优点:** 操作简单,使用Java集合,比DOM更直观。
   - **缺点:** 内存占用较大。

   ```java
   // 使用 org.jdom2 包中的 SAXBuilder 来解析 XML
   SAXBuilder builder = new SAXBuilder();
   Document document = builder.build(new File("example.xml"));
   ```

private static void jdomTest() {
    try {
        // Load the XML file
        File xmlFile = new File("D:\\CodeAll\\code\\Exercies\\src\\huizhi\\xmltest\\StudentTable.xml");

        // Create a JDOM document
        SAXBuilder saxBuilder = new SAXBuilder();
        Document document =  saxBuilder.build(xmlFile);

        // Get the root element
        Element rootElement = document.getRootElement();

        // Get all student elements
        List<Element> studentList = rootElement.getChildren("student");

        for (Element studentElement : studentList) {
            // Extract data from student element
            String name = studentElement.getChildText("name");
            String age = studentElement.getChildText("age");
            String grade = studentElement.getChildText("grade");
            String subject = studentElement.getChildText("subject");

            // Print extracted information
            System.out.println("Name: " + name);
            System.out.println("Age: " + age);
            System.out.println("Grade: " + grade);
            System.out.println("Subject: " + subject);
            System.out.println("------------------------");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

4. **StAX解析(Streaming API for XML):**
   - **优点:** 基于事件驱动,适用于大型XML文件,内存消耗小。
   - **缺点:** 编程较为复杂。

   ```java
   // 使用 javax.xml.stream 包中的 XMLInputFactory 来解析 XML
   XMLInputFactory factory = XMLInputFactory.newInstance();
   XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("example.xml"));
   ```

选择解析方式通常取决于具体的应用场景和需求。如果需要对XML文档进行修改,DOM解析可能更合适;如果处理大型XML文件,可以选择SAX或StAX以减小内存开销;而JDOM则提供了一种较为简单的API。

private static void dom4jTest() {
    try {
        // Load the XML file using dom4j
        File xmlFile = new File("D:\\CodeAll\\code\\Exercies\\\\src\\huizhi\\xmltest\\StudentTable.xml");
        SAXReader reader = new SAXReader();
        Document document = reader.read(xmlFile);

        // Get the root element
        Element rootElement = document.getRootElement();

        // Get all student elements
        List<Element> studentList = rootElement.elements("student");

        // Iterate through each student
        for (Element studentElement : studentList) {
            // Extract data from student element
            String name = studentElement.elementText("name");
            String age = studentElement.elementText("age");
            String grade = studentElement.elementText("grade");
            String subject = studentElement.elementText("subject");

            // Print student information
            System.out.println("Name: " + name);
            System.out.println("Age: " + age);
            System.out.println("Grade: " + grade);
            System.out.println("Subject: " + subject);
            System.out.println("------------------------");
        }
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值