欢迎访问宙启技术站
智能推送

Java函数:如何解析并操作XML文档?

发布时间:2023-05-22 18:09:55

XML(可扩展标记语言)是一种用于描述数据的标记语言,被广泛应用于Web应用程序和其他在线应用程序中。在Java程序中,操作XML文档通常涉及到解析和读取XML文件以及生成XML输出,因此要理解如何编写Java函数来操作XML文档。在本文中,我们将讨论XML文档的解析和读取,并提供一些例子来演示如何操作XML文档。

解析XML文档

Java程序利用Java DOM、Java SAX和Java StAX等技术来解析XML文件。DOM技术将XML文档转换为树状结构,SAX技术将XML文档解析为一系列事件,而StAX技术将XML文档解析为流式数据。在此,我们将详细介绍这些技术。

1. Java DOM解析器

DOM(文档对象模型)是一种用于解析XML文档的标准API。在DOM解析器中,整个XML文档被解析为树状结构,其中每个XML节点被表示为对象,并且可以直接修改XML节点并重新生成XML输出。

以下是使用Java DOM解析XML文档的基本代码:

import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

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");
      System.out.println("-----------------------------");
      for (int temp = 0; temp < nList.getLength(); temp++) {
         Node nNode = nList.item(temp);
         System.out.println("
Current 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("Nickname : " 
               + eElement.getElementsByTagName("nickname")
                  .item(0)
                  .getTextContent());
            System.out.println("Marks : " 
               + eElement.getElementsByTagName("marks")
                  .item(0)
                  .getTextContent());
         }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

在这个例子中,我们解析名为“input.xml”的XML文件,并访问其节点以获取属性和文本内容。我们可以看到,DOM解析器将XML文档表示为层次结构,并根据节点名称和属性访问节点。使用DOM解析器可以进行复杂的XML文档操作。

2. Java SAX解析器

SAX(简单API for XML)是一种基于事件驱动的API,将XML文档解析为一系列事件,并在事件发生时采取相应的操作。相比于DOM解析器,SAX解析器使用更少的内存,并且更适合处理大型XML文档。

以下是使用Java SAX解析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 {
      File inputFile = new File("input.xml");
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser saxParser = factory.newSAXParser();
      UserHandler userhandler = new UserHandler();
      saxParser.parse(inputFile, userhandler);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

class UserHandler 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 {
  }

  @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;
    }
  }
}

在这个例子中,我们实现了一个UserHandler类,用于处理XML文档中的事件,包括起始元素、尾部元素和文本内容。使用SAX解析器解析XML文档可以实现快速的XML数据读取和处理。

3. Java StAX解析器

StAX(流式扩展标记语言)是一种流驱动的API。StAX解析器用于处理大型XML文档和不能放入内存中的XML文档。 StAX解析器将XML文档解析为迭代器流的形式,程序员可以在流上进行循环操作来读取XML文档的数据。

以下是使用Java StAX解析XML文档的基本代码:

` java

import java.io.File;

import javax.xml.stream.XMLInputFactory;

import javax.xml.stream.XMLStreamConstants;

import javax.xml.stream.XMLStreamReader;

public class StaxParserExample {

public static void main(String[] args) {

boolean bFirstName = false;

boolean bLastName = false;

boolean bNickName = false;

boolean bMarks = false;

try {

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

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLStreamReader reader =

factory.createXMLStreamReader(inputFile);

while (reader.hasNext()) {

int event = reader.next();

switch (event) {

case XMLStreamConstants.START_ELEMENT:

String elementName = reader.getLocalName();

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

String rollNo = reader.getAttributeValue(0);

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

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

bFirstName = true;

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

bLastName = true;

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

bNickName = true;

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

bMarks = true;

}

break;

case XMLStreamConstants.CHARACTERS:

if (bFirstName) {

System.out.println("First Name: "

+ reader.getText());

bFirstName = false;

}

if (bLastName) {

System.out.println("Last Name: "

+ reader.getText());

bLastName = false;

}

if (bNickName) {

System.out.println("Nick Name: "

+ reader.getText());

bNickName = false;

}

if (bMarks) {

System.out.println("Marks: "

+ reader.getText());

bMarks = false;

}

break;

case XMLStreamConstants.END_ELEMENT:

break