Java操作Xml

一、数据准备

1、文件头实体类

java 复制代码
package com.xiaobai.xmlpractice;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @Author 王天文
 * @Date 2024/12/18 21:46
 * @Description: xml头
 */
@AllArgsConstructor
@Data
public class Head {
    private String desc;

    private String name;

    private String id;
}

2、人员信息实体类

java 复制代码
package com.xiaobai.xmlpractice;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @Author 王天文
 * @Date 2024/12/18 20:41
 * @Description:
 */
@AllArgsConstructor
@Data
public class Person {

    private Integer id;

    private String name;

    private Integer age;

    private String sex;

    private String account;

    private String profession;
}

二、使用org.w3c.dom操作xml

1、创建xml

(1)创建document对象

java 复制代码
    /**
     * 创建document对象
     * @return
     * @throws Exception
     */
    public Document createDoc() throws Exception {

        // 创建一个新的Document对象
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.newDocument();

        return doc;
    }

(2)添加子节点

java 复制代码
    /**
     * 添加子节点
     * @param doc document对象
     * @param parentElement 上级节点
     * @param tagName 标签名称
     * @param value 标签值
     */
    public void addElement(Document doc, Element parentElement, String tagName, String value) {
        Element element = doc.createElement(tagName);
        element.appendChild(doc.createTextNode(value));
        parentElement.appendChild(element);
    }

(3)根据数据生成xml字符串

java 复制代码
    public String createXmlStr() throws Exception {
        // 创建一个新的Document对象
        Document doc = createDoc();

        // 根结点
        Element root = doc.createElement("root");
        doc.appendChild(root);

        // 数据头
        Element headElement = doc.createElement("head");
        headElement.appendChild(doc.createTextNode("人员信息"));
        root.appendChild(headElement);

        // 数据结点
        Element bodyElement = doc.createElement("body");
        root.appendChild(bodyElement);
        addData(doc, bodyElement);

        // 设置Transformer并指定XML声明头部
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
        transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");

        // 生成XML字符串
        DOMSource source = new DOMSource(doc);
        StringWriter writer = new StringWriter();
        StreamResult stringResult = new StreamResult(writer);
        transformer.transform(source, stringResult);

        // xml字符串
        String xmlContent = writer.toString();

        return xmlContent;
    }

    // 添加数据
    public void addData(Document doc, Element parentElement) {
        Person person = new Person(1, "张三", 29, "男", "zhangsan", "程序员");

        addElement(doc, parentElement, "id", String.valueOf(person.getId()));
        addElement(doc, parentElement, "name", person.getName());
        addElement(doc, parentElement, "age", String.valueOf(person.getAge()));
        addElement(doc, parentElement, "account", person.getAccount());
        addElement(doc, parentElement, "profession", person.getProfession());
    }

(4)测试

java 复制代码
    @Test
    public void testCreate() throws Exception {
        String xmlStr = createXmlStr();
        log.info(xmlStr);
    }

输出:

16:39:24.426 [main] INFO com.xiaobai.xmlpractice.W3CDocTest - <?xml version="1.0" encoding="ISO-8859-1"?><root><head>&#20154;&#21592;&#20449;&#24687;</head><body><id>1</id><name>&#24352;&#19977;</name><age>29</age><account>zhangsan</account><profession>&#31243;&#24207;&#21592;</profession></body></root>

2、解析xml字符串

java 复制代码
    @Test
    public void testParseXml() throws Exception {

        String xmlContent = createXmlStr();

        // 解析xml字符串
        DocumentBuilderFactory analyzeBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder analyzeBuilder = analyzeBuilderFactory.newDocumentBuilder();
        // 字符串转换成document对象
        Document document = analyzeBuilder.parse(new InputSource(new StringReader(xmlContent)));
        NodeList idNodeList = document.getElementsByTagName("name");
        String nodeValue = idNodeList.item(0).getChildNodes().item(0).getNodeValue();
        log.info(nodeValue);
    }

输出:

16:41:06.619 [main] INFO com.xiaobai.xmlpractice.W3CDocTest - 张三

三、使用dom4j操作xml

1、添加依赖

XML 复制代码
		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6.1</version>
		</dependency>
		<dependency>
			<groupId>jaxen</groupId>
			<artifactId>jaxen</artifactId>
			<version>1.1.1</version>
		</dependency>

2、创建xml

(1)示例代码

java 复制代码
    public String createXmlStr() {
        Document document = DocumentHelper.createDocument();

        // 根节点
        Element rootElement = document.addElement("root");

        /*添加数据头*/
        // head节点
        Element headElement = rootElement.addElement("head");
        Head head = new Head("请求报文头", "技术有限公司", "1");
        // 添加desc子节点
        headElement.addElement("desc").addText(head.getDesc());
        // 添加name子节点
        headElement.addElement("name").addText(head.getName());
        // 添加id子节点
        headElement.addElement("id").addText(head.getId());

        // 创建data节点
        Element bodyElement = rootElement.addElement("data");

        // 添加数据信息
        Element infoElement = bodyElement.addElement("info");
        infoElement.addElement("id").addText("00001");
        infoElement.addElement("name").addText("张三");
        infoElement.addElement("age").addText("29");

        // 设置xml编码
        document.setXMLEncoding("ISO-8859-1");

        return document.asXML();
    }

(2)测试方法

java 复制代码
    @Test
    public void createTest() {
        String xmlStr = createXmlStr();
        log.info(xmlStr);
    }

输出:

16:42:53.724 [main] INFO com.xiaobai.xmlpractice.Dom4jTest - <?xml version="1.0" encoding="ISO-8859-1"?>

<root><head><desc>请求报文头</desc><name>技术有限公司</name><id>1</id></head><data><info><id>00001</id><name>张三</name><age>29</age></info></data></root>

3、解析xml

java 复制代码
    @Test
    public void parseTest() throws Exception {
        String xmlStr = createXmlStr();

        Document document = DocumentHelper.parseText(xmlStr);

        // 获取根节点
        Element rootElement = document.getRootElement();

        // 获取data节点
        List<Element> dataElements = rootElement.elements("data");
        Element dataElement = dataElements.get(0);

        // 获取info节点
        List<Element> infoElements = dataElement.elements("info");
        Element infoElement = infoElements.get(0);

        // 获取name节点
        Element nameElement = infoElement.element("name");
        log.info(nameElement.getText());

    }

输出:

16:45:19.682 [main] INFO com.xiaobai.xmlpractice.Dom4jTest - 张三

相关推荐
weixin_5375904521 分钟前
《Java编程入门官方教程》第八章练习答案
java·开发语言·servlet
CodeClimb1 小时前
【华为OD-E卷-最左侧冗余覆盖子串 100分(python、java、c++、js、c)】
java·python·华为od
Q_19284999061 小时前
基于Spring Boot的大学就业信息管理系统
java·spring boot·后端
xmh-sxh-13141 小时前
常用数据库类型介绍
java
single5941 小时前
【c++笔试强训】(第四十一篇)
java·c++·算法·深度优先·图论·牛客
1 9 J1 小时前
Java 上机实践11(组件及事件处理)
java·开发语言·学习·算法
爬菜2 小时前
java简单题目练习
java
bufanjun0012 小时前
JUC并发工具---ThreadLocal
java·jvm·面试·并发·并发基础
南宫生2 小时前
力扣-图论-70【算法学习day.70】
java·学习·算法·leetcode·图论