dom4j 操作 xml 之按照顺序插入标签

最近学了一下 dom4j 操作 xml 文件,特此记录一下。

java 复制代码
public class Dom4jNullTagFiller {

    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();
        //加载 xml 文件
        Document document = reader.read("C:\\Users\\24596\\Desktop\\test.xml");
        //首先获取根元素,然后调用 element 或者 elements 方法获取子元素
        Element root = document.getRootElement();
        // 获取名为 EInvoiceData 的子元素
        Element eInvoiceData = root.element("EInvoiceData");
        //因为需要按照顺序插入标签,所以应该定义好标签的顺序,便于查找之前的标签,并在对应位置插入当前标签
        String[] tagNames = {"ItemName", "SpecMod", "MeaUnits", "Quantity", "UnPrice", "Amount",
                "TaxRate", "ComTaxAm", "TotaltaxIncludedAmount", "TaxClassificationCode"};
        //获取 EInvoiceData 下的名为 IssuItemInformation 的元素列表,因为 EInvoiceData 下有多个 IssuItemInformation ,每个 IssuItemInformation 都需要进行操作,当前也可以获取指定索引的 IssuItemInformation 元素
        List<Element> issuItemInformations = eInvoiceData.elements("IssuItemInformation");
        // 遍历 IssuItemInformation 元素
        for (Element issuItemInformation : issuItemInformations) {
            // 获取 issuItemInformation 下的子元素,方便获取元素的一些信息,比如索引
            List<Element> list = issuItemInformation.elements();
            //因为从1开发,所以需要对索引位置为0的 ItemName 标签进行特殊处理
            if(issuItemInformation.element("ItemName")==null){
                list.add(DocumentHelper.createElement("ItemName").addText(""));
            }
            // 遍历判断 tagNames 中定义的标签是否为空,如果为空,需要按照顺序插入空标签
            for (int i = 1; i < tagNames.length; i++) {
                Element element = issuItemInformation.element(tagNames[i]);
                if (element == null) {
                    Element newElement = DocumentHelper.createElement(tagNames[i]).addText("");
                    // 获取前一个标签的位置,在后面插入空标签
                    list.add(list.indexOf(issuItemInformation.element(tagNames[i-1])) + 1,newElement);
                }
            }
        }
        //这里可以调用 document.asXML() 方法在控制台打印 改变之后的 xml 数据
        //System.out.println(document.asXML());
        // 生成新的 XML 文件
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer;
        try (FileWriter fileWriter = new FileWriter("C:\\Users\\24596\\Desktop\\new.xml")) {
            writer = new XMLWriter(fileWriter, format);
            writer.write(document);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上添加了详细注释的代码,读者可以直接拿来用,需要修改的部分是获取指定元素的名称以及 tagNames 数组。下面展示一下效果图片:

原 xml 文件:

修改之后的 xml 文件:

如果能给你带来帮助,那将是我的荣幸

相关推荐
前网易架构师-高司机3 天前
带标注的扑克牌识别数据集,识别率99.5%,3083张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·数字·扑克牌·纸牌
执明wa4 天前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
IT_Octopus6 天前
一次由 RestTemplate 引发的 Connection reset:被 XML 截胡的请求体
xml·java·spring boot
Dontla6 天前
网站爬虫控制策略介绍(robots.txt、sitemap.xml、x-robots-tag、noindex、nofollow)网站索引
xml·爬虫·dubbo
风起洛阳@不良使7 天前
spring中xml和注解开发的对比
xml·java·spring
Mikowoo0078 天前
批量汇总XML格式的发票信息
xml·python
逃逸线LOF8 天前
xml文件如何加载properties文件(spring容器加载properties文件)
xml
前网易架构师-高司机11 天前
带标注的山体滑坡塌方数据集数据集,识别率78.1%,974张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·自然灾害·山体滑坡
程序媛kelly11 天前
.xml / .jrxml 文件怎么打开?OpenFiles 实测预览、编辑、搜索与 AI 摘要排查流程
xml·人工智能·jrxml
潘潘的嵌入式日记11 天前
改完Keil工程文件被缓存覆盖?——uvprojx编辑的进阶四坑
xml·嵌入式·keil·调试·mdk·工程文件