Java生成和解析XML格式文件和字符串的实例代码

下面我将详细讲解“Java生成和解析XML格式文件和字符串的实例代码”的完整攻略以及其中的两个示例。

1. 什么是XML

XML是可扩展标记语言(Extensible Markup Language)的缩写,它是一种用于传输和存储数据的标准格式。XML是自我描述、可扩展的,可以通过文本编辑器或工具生成并解析。在Java应用程序中,XML是一种常见的数据交换格式。

2. 生成XML文件或字符串

在Java中,可以使用DOM或SAX来生成XML文件或字符串。下面分别介绍这两种生成方式的实现。

2.1 使用DOM生成XML文件或字符串

DOM是一种基于内存的解析方式,在生成XML文档时,它会先将整个文档加载到内存中,然后在内存中进行操作,最后再将整个文档输出到文件或字符串中。下面是一个使用DOM生成XML文件或字符串的示例代码:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import java.io.File;

public class DomWriter {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.newDocument();

            // 父节点
            Element rootElement = doc.createElement("root");
            doc.appendChild(rootElement);

            // 子节点
            Element childElement = doc.createElement("child");
            rootElement.appendChild(childElement);
            childElement.appendChild(doc.createTextNode("Hello World"));

            // 输出到文件或字符串
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);

            // 输出到文件
            StreamResult result = new StreamResult(new File("output.xml"));
            transformer.transform(source, result);

            // 输出到字符串
            StringWriter writer = new StringWriter();
            transformer.transform(source, new StreamResult(writer));
            String xmlString = writer.getBuffer().toString();

            System.out.println(xmlString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.2 使用SAX生成XML文件或字符串

SAX是一种基于事件流的解析方式,在生成XML文档时,它会将文档的不同部分分成不同的事件,并且在解析时一次只处理一个事件,适用于较大的XML文件。下面是一个使用SAX生成XML文件或字符串的示例代码:

import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

import java.io.File;
import java.io.FileWriter;

import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;

public class SaxWriter extends DefaultHandler {
    private String elementName;
    private FileWriter writer;

    public SaxWriter(String fileName) throws Exception {
        writer = new FileWriter(new File(fileName));
    }

    public void startDocument() {
        try {
            writer.write("<?xml version=\"1.0\"?>\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void endDocument() {
        try {
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void startElement(String uri, String localName, String qName, Attributes attributes) {
        try {
            elementName = qName;
            writer.write("<" + qName + ">");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void endElement(String uri, String localName, String qName) {
        try {
            writer.write("</" + qName + ">");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void characters(char ch[], int start, int length) {
        String value = new String(ch, start, length).trim();
        if (value.length() > 0) {
            try {
                writer.write(value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            String fileName = "output.xml";
            SaxWriter handler = new SaxWriter(fileName);

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();

            parser.parse(new File(fileName), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 解析XML文件或字符串

在Java中,可以使用DOM、SAX或StAX来解析XML文件或字符串。下面介绍这三种解析方式的实现。

3.1 使用DOM解析XML文件或字符串

DOM是一种基于内存的解析方式,在解析XML文档时,它会先将整个文档加载到内存中,然后在内存中进行操作。下面是一个使用DOM解析XML文件或字符串的示例代码:

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;

public class DomReader {
    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("child");
            System.out.println("----------------------------");

            for (int i = 0; i < nList.getLength(); i++) {
                Node nNode = nList.item(i);
                System.out.println("\nCurrent Element :" + nNode.getNodeName());
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    System.out.println("Child element content: " + eElement.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.2 使用SAX解析XML文件或字符串

SAX是一种基于事件流的解析方式,在解析XML文档时,它会将文档的不同部分分成不同的事件,并且在解析时一次只处理一个事件,适用于较大的XML文件。下面是一个使用SAX解析XML文件或字符串的示例代码:

import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

import java.io.File;

import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;

public class SaxReader extends DefaultHandler {
    private String currentElement;

    public void startElement(String uri, String localName, String qName, Attributes attributes) {
        currentElement = qName;
    }

    public void characters(char[] ch, int start, int length) {
        String content = new String(ch, start, length);
        if (currentElement.equals("child")) {
            System.out.println("Child element content: " + content);
        }
    }

    public static void main(String[] args) {
        try {
            String fileName = "input.xml";
            SaxReader handler = new SaxReader();

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();

            parser.parse(new File(fileName), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.3 使用StAX解析XML文件或字符串

StAX是Sax和DOM结合的解析方式,它同时具备了Sax的流式处理和DOM的便利操作。下面是一个使用StAX解析XML文件或字符串的示例代码:

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;

import java.io.FileInputStream;

public class StaxReader {
    public static void main(String[] args) {
        try {
            String xmlFile = "input.xml";

            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream(xmlFile));

            String currentElement = "";
            while (reader.hasNext()) {
                int event = reader.next();
                switch (event) {
                    case XMLStreamConstants.START_ELEMENT:
                        currentElement = reader.getLocalName();
                        break;
                    case XMLStreamConstants.CHARACTERS:
                        String content = reader.getText().trim();
                        if (currentElement.equals("child")) {
                            System.out.println("Child element content: " + content);
                        }
                        break;
                    case XMLStreamConstants.END_ELEMENT:
                        currentElement = "";
                        break;
                }
            }

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

至此,我们就完成了Java生成和解析XML格式文件和字符串的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java生成和解析XML格式文件和字符串的实例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 如何使用java制作假数据接口

    我们来详细讲解如何使用Java制作假数据接口的完整攻略。 什么是假数据接口 假数据接口是一种用于模拟真实数据的虚拟接口,通常用于在开发过程中替代实际接口进行测试、演示和展示。通过模拟数据,可以确保应用程序在与真实数据交互时能够正常工作,同时也可以在后端 API 开发尚未完成或测试环境不可用时进行前端开发。 如何使用Java制作假数据接口 在Java中,我们可…

    Java 2023年5月26日
    00
  • 基于servlet的执行原理与生命周期(全面解析)

    基于servlet的执行原理与生命周期(全面解析) Servlet 是一种 Java 技术,可以用于生成动态 Web 内容。本文将详细介绍 Servlet 的执行原理与生命周期。 Servlet 执行原理 Servlet 是基于请求/响应模型的,当客户端发送请求时,Servlet 容器会根据请求的 URL 将请求分发到相应的 Servlet,并调用相应的方法…

    Java 2023年5月26日
    00
  • 解决idea使用过程中让你觉得不爽的一些问题(小结)

    解决idea使用过程中让你觉得不爽的一些问题 IntelliJ IDEA 是一款非常强大的 Java 集成开发环境,但是在使用过程中会遇到一些让人不爽的问题。下面是解决这些问题的攻略。 问题一:IntelliJ IDEA 启动慢 解决办法: 删除项目中的 .idea 文件夹,清空缓存 在 IntelliJ IDEA 中,提供了清除缓存的功能,操作步骤是:点击…

    Java 2023年5月20日
    00
  • 详解利用spring-security解决CSRF问题

    详解利用spring-security解决CSRF问题 CSRF(Cross-Site Request Forgery)跨站请求伪造漏洞是我们开发中比较常见的一种安全问题,攻击者通过欺骗用户在受信任的网站上执行某些操作,例如转账、修改个人信息、发送恶意邮件等等。Spring Security 是Spring官方的安全框架,提供了一些开箱即用的防护机制,其中就…

    Java 2023年5月20日
    00
  • Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法

    这里提供一种Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法,共分为以下几个步骤: 步骤一:导入必要的依赖库 Java的MD5加密算法和FTP传输需要用到两个依赖库:commons-codec和commons-net。所以,需要在Java项目中导入相应的依赖库,示例代码如下: <dependency> <groupId&gt…

    Java 2023年5月23日
    00
  • java面向对象:API(接口)与集合(ArrayList)

    Java 面向对象:API(接口)与集合(ArrayList)完整攻略 什么是接口 在 Java 编程中,接口是一种抽象类型,它描述了类能做什么而不描述它们是怎么做到的。接口定义了一个类应该有哪些方法,并且不提供这些方法的实现。任何实现这个接口的类都必须提供它定义的方法。 接口的语法如下: // 定义一个接口 public interface Interfa…

    Java 2023年5月26日
    00
  • 导入SpringCloud依赖踩的坑及解决

    下面我将详细讲解“导入SpringCloud依赖踩的坑及解决”的完整攻略。 导入SpringCloud依赖踩的坑及解决 1. 问题描述 在开发SpringCloud项目时,我们需要导入一些SpringCloud相关的依赖包,但在引入这些依赖时,可能会遇到一些坑,阻碍我们项目的正常开发。以下是一些可能遇到的问题: 版本依赖冲突问题:SpringCloud的各个…

    Java 2023年5月31日
    00
  • Java中的反射是什么?

    Java中的反射是指在运行时获取一个类的信息,并能够操作该类的成员变量、方法和构造方法。这种能力被称为“反射”。反射机制使Java程序可以在运行时动态加载、检查和使用类的相关信息,而不需要在编译时确定类名和方法名。 反射的作用 反射的作用主要有以下四个方面: 动态加载类,可以在运行时通过类名来获取对应的Class对象,从而实现动态加载类的效果。 动态获取类的…

    Java 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部