首页 > 编程语言 >使用Java构造XML字符串

使用Java构造XML字符串

时间:2023-05-28 14:46:27浏览次数:44  
标签:XML xml Java String Node import 字符串 new null

使用如下工具类可以自行构建想要的XML字符串。需要引入lombok依赖(懒得写get和set方法了)

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

具体实现如下

import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class XmlBuilder {

    public static void main(String[] args) throws Exception {

        List<Node> nodeList = new ArrayList<>();

        nodeList.add(new Node("employee", null, null,List.of(new Node("department","行政处",null,null))));
        System.out.println(build("xml", nodeList));

        List<Node> nodeList2 = new ArrayList<>();
        nodeList2.add(new Node("Parent", null, null,null));
        nodeList2.add(new Node("Child1", "Child1value", null,null));
        nodeList2.add(new Node("Child2", null, Arrays.asList(new Attribute("attribute1", "value1"), new Attribute("attribute2", "value2")),null));
        String xmlString = build("xml", nodeList2);
        System.out.println(xmlString);

    }

    /**
     * 构造XML字符串
     * @param rootElementName 根元素名
     * @param nodeList        节点列表
     * @return 构造的XML字符串
     */
    public static String build(String rootElementName, List<Node> nodeList) throws Exception {

        // 创建DocumentBuilderFactory和DocumentBuilder对象
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

        // 创建新的Document对象和根元素
        Document doc = dBuilder.newDocument();
        Element rootElement = doc.createElement(rootElementName);
        doc.appendChild(rootElement);

        // 添加子节点和属性到根元素
        for (Node node : nodeList) {
            Element element = doc.createElement(node.getName());
            element.setTextContent(node.getValue());
            if (Objects.nonNull(node.getAttributeList())) {
                //设置结点的属性值
                for (Attribute attribute : node.getAttributeList()) {
                    element.setAttribute(attribute.getName(), attribute.getValue());
                }
            } else if (Objects.nonNull(node.getChildrenList())) {
                //如果该结点有子节点,则添加子节点的值
                for (Node child : node.getChildrenList()) {
                    Element childElement = doc.createElement(child.getName());
                    childElement.setTextContent(child.getValue());
                    //设置子结点的属性值
                    if (Objects.nonNull(child.getAttributeList())) {
                        for (Attribute attribute : child.getAttributeList()) {
                            childElement.setAttribute(attribute.getName(), attribute.getValue());
                        }
                    }

                    //添加子节点
                    element.appendChild(childElement);
                }
            }

            //将结点添加到根结点下
            rootElement.appendChild(element);
        }

        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        //去除XML头部声明(<?xml version="1.0" encoding="UTF-8" standalone="no"?>)
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        //启用缩进
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        //指定了缩进量,可以将 "2" 替换成其他值,如 "4" 或 "tab" 等
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        // 设置字符编码
        transformer.setOutputProperty(OutputKeys.ENCODING, StandardCharsets.UTF_8.name());

        // 将新的Document对象转换为字符串输出
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(doc), new StreamResult(writer));
        return writer.toString().trim();
    }

    /**
     * 节点类
     */
    @Data
    @AllArgsConstructor
    public static class Node {
        private final String name;
        private final String value;
        private final List<Attribute> attributeList;
        private final List<Node> childrenList;
    }

    /**
     * 属性类
     */
    @Data
    @AllArgsConstructor
    public static class Attribute {
        private final String name;
        private final String value;
    }
}

测试结果(如果需要xml头部的声明,可自行去除代码的配置即可)

<xml>
  <employee>
    <department>行政处</department>
  </employee>
</xml>

<xml>
  <Parent/>
  <Child1>Child1value</Child1>
  <Child2 attribute1="value1" attribute2="value2"/>
</xml>

 

标签:XML,xml,Java,String,Node,import,字符串,new,null
From: https://www.cnblogs.com/52-IT-y/p/17438217.html

相关文章

  • Elasticsearch掰开揉碎第11篇java操作ES前期准备
    引言上一篇主要讲解的是:使用eclipse创建普通java项目\maven项目,使用idea创建普通java项目\maven项目。本篇主要讲解的是:使用java操作Elasticsearch的前期准备(创建索引库、设置mapping、插入数据、验证数据、创建maven项目)前期准备之数据1、创建索引库curl-XPUT'http://192.168......
  • java中的常用类及常用方法
    java中的常用类及常用方法math类的常用方法方法名说明publicstaticintabs(inta)获取参数绝对值publicstaticdoubleceil(doublea)向上取整publicstaticdoubleflcor(doublea)向下取整publicstaticintround(floata)四舍五入publicstaticin......
  • java中throw和throws的区别
    在Java中,throw和throws是两个关键字,用于处理异常。throw用于在程序中手动抛出一个异常。它用于指示程序中的某个错误状态,并将异常抛回到相应的调用栈。例如:if(user==null){thrownewIllegalArgumentException("Usercannotbenull.");}在上述代码中,如果用户为空,则手动......
  • LeetCode-Java题解 977. Squares of a Sorted Array
    题目地址:977.SquaresofaSortedArray解题思路:    又是一道双指针的题目,看见秒想到双指针(平方直接调用sort方法也行,但是这么写这题就没意思了)。但是,我一直在想,不增加空间消耗的情况下,如何进行排列,想了半天把自己绕进去了。开辟一个新数组,倒序放置就非常简单了。一定要利......
  • IDEA中创建java多模块项目和打包
    文章来源:https://www.jb51.net/article/210892.htm#_label7   非常感谢。一、使用springinitializr创建java工程1、启动IDEA,新建java工程,使用向导创建一个springboot框架的工程 2.设置项目信息,java版本选择8 3、勾选项目需要用到的依赖 4、设置项目名称,点击......
  • 【python基础】基本数据类型-字符串类型
    1.初识字符串字符串就是一系列字符。在python中,用引号括起来文本内容的都是字符串。其语法格式为:‘文本内容’或者“文本内容”我们发现其中的引号可以是单引号,也可以是双引号。这样的灵活性可以使我们进行引号之间的嵌套。编写程序如下所示:运行结果如下所示我们可以发现......
  • 云原生时代的Java
     Java最大的地基(护城河)是其极其强大的软件生态以及极其庞大的使用者人群。在云原生的时代下,Java的统治地位不仅没有到什么坚不可摧,无后顾之忧的程度,说Java目前处于危机四伏的地位都不为过。最根本的原因是,目前随着云原生时代的到来,有一些以前植入Java语言的基因之中的,很多的假......
  • 快速熟悉String提供的处理字符串的常用方法
    packagecom.String;publicclassStringDemo{publicstaticvoidmain(String[]args){//快速熟悉String提供的处理字符串的常用方法Strings="黑马java";//1.获取字符串长度System.out.println(s.length());//2.提取字......
  • 阅读《java并发编程实战》第十章
    例1:简单的加锁顺序导致的死锁:publicclassLeftRightDeadlock{privatefinalObjectleft=newObject();privatefinalObjectright=newObject();publicvoidleftRight(){synchronized(left){synchronized(right){......
  • Java:Jenv多版本管理工具(自由切换Java版本)
    文档https://www.jenv.be/https://github.com/jenv/jenv安装gitclonehttps://github.com/jenv/jenv.git~/.jenv编辑配置文件vim~/.bash_profile写入环境变量#jenvexportPATH="$HOME/.jenv/bin:$PATH"eval"$(jenvinit-)"#重启shellexec$SHELL-l......