xml解析

文章讲述了两个Java类(oldXml和newXml)如何使用DOM解析XML文件,分别提取voucher_head和voucher_body的信息,并计算pk_accasoa下的debitamount和localdebitamount之和,最后将结果输出到文本文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述

package com.lune.readxmlUtils;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

public class oldXml {
    public static void main(String[] args) {
        try {
            File file = new File("C:\\Users\\14549\\Desktop\\compare\\oldXml.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
            Document doc = db.parse(is);
            // Document doc = db.parse(file);
            doc.getDocumentElement().normalize();
            //  todo 处理 voucher_head
            Map<String, String> voucherHead = getVoucherHead(doc);
            // 输出结果
            for (Map.Entry<String, String> entry : voucherHead.entrySet()) {
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }
            //  todo 处理 voucher_body
            List<Map<String, String>> voucherBody = getVoucherBody(doc);
            // 输出结果
            for (int i = 0; i < voucherBody.size(); i++) {
                System.out.println("Entry " + (i + 1) + " values: " + voucherBody.get(i));
            }

            //  todo 对 pk_accasoa 进行分组,debitamount 和localdebitamount求出集合中数字之和
            Map<String, Double> sumOfAmounts = sumVouchers(voucherBody);
            // 输出结果
            System.out.println("Sum of Amounts:");
            sumOfAmounts.forEach((key, value) -> System.out.println(key + ": " + value));

            //   todo 输出文件
            outPutFile(voucherHead,voucherBody);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static Map<String, Double>  sumVouchers(List<Map<String, String>> vouchers) {
  // 创建一个存放每组和的集合
        Map<String, Double> sumOfAmounts = new HashMap<>();
        // 对每组的 debitamount 和 localdebitamount 求和并存放到合适的集合
        for (Map<String, String> voucher : vouchers) {
            String accountcode = voucher.get("accountcode");
            double primaryDebitAmount = Double.parseDouble(voucher.get("primary_debit_amount").replace(",", ""));
            double naturalDebitCurrency = Double.parseDouble(voucher.get("natural_debit_currency").replace(",", ""));
            // 计算每组的和
            double sum = primaryDebitAmount + naturalDebitCurrency;
//            String sumString = String.valueOf(sum);
            // 将每组的和存放到集合中
            if (sumOfAmounts.containsKey(accountcode)) {
                double currentSum = sumOfAmounts.get(accountcode);
                sumOfAmounts.put(accountcode, currentSum + sum);
            } else {
                sumOfAmounts.put(accountcode, sum);
            }
        }
        return  sumOfAmounts;
    }
    private static void outPutFile(Map<String, String> voucherHead, List<Map<String, String>> voucherBody) {
        // 准备文件名
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
        String fileName = "output_" + dateFormat.format(new Date()) + ".txt";
        String filePath = "C:\\Users\\14549\\Desktop\\compare"; // 替换为实际的输出位置
        // 输出 voucherHead 和 voucherBody 到文件
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath + File.separator + fileName))) {
            // 输出 voucherHead
            writer.write("#### Voucher Head ####" + System.lineSeparator());
            for (Map.Entry<String, String> entry : voucherHead.entrySet()) {
                writer.write(entry.getKey() + ": " + entry.getValue() + System.lineSeparator());
            }
            // 使用空行分隔 voucherHead 和 voucherBody
            writer.write(System.lineSeparator());
            // 输出 voucherBody
            writer.write("#### Voucher Body ####" + System.lineSeparator());
            for (Map<String, String> item : voucherBody) {
                for (Map.Entry<String, String> entry : item.entrySet()) {
                    writer.write(entry.getKey() + ": " + entry.getValue() + System.lineSeparator());
                }
                writer.write("--------------------" + System.lineSeparator());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 打印输出文件位置
        System.out.println("输出文件位置: " + new File(filePath, fileName).getAbsolutePath());
    }
    private static List<Map<String, String>>  getVoucherBody(Document doc) {
        Element voucherBody = (Element) doc.getElementsByTagName("voucher_body").item(0);
        NodeList entryList = voucherBody.getElementsByTagName("entry");
        List<Map<String, String>> entryValuesList = new ArrayList<>();
        for (int i = 0; i < entryList.getLength(); i++) {
            Element entry = (Element) entryList.item(i);
            Map<String, String> entryValues = new HashMap<>();
            // 获取entry标签中的所有子元素的值
            NodeList childNodes = entry.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                if (childNodes.item(j) instanceof Element) {
                    Element childElement = (Element) childNodes.item(j);
                    entryValues.put(childElement.getTagName(), childElement.getTextContent());
                }
            }
            entryValuesList.add(entryValues);
        }
        return entryValuesList;
    }
    private static Map<String, String> getVoucherHead(Document doc ) {
        // 创建一个Map来存储XML中的所有信息
        Map<String, String> xmlInfo = new HashMap<>();
        // 存储XML声明中的版本和编码
        xmlInfo.put("xmlVersion", doc.getXmlVersion());
        xmlInfo.put("xmlEncoding", doc.getXmlEncoding());
        Element ufinterface = (Element) doc.getElementsByTagName("ufinterface").item(0);
        // 存储ufinterface标签中的属性值
        xmlInfo.put("roottag", ufinterface.getAttribute("roottag"));
        xmlInfo.put("billtype", ufinterface.getAttribute("billtype"));
        xmlInfo.put("receiver", ufinterface.getAttribute("receiver"));
        xmlInfo.put("sender", ufinterface.getAttribute("sender"));
        xmlInfo.put("isexchange", ufinterface.getAttribute("isexchange"));
        xmlInfo.put("filename", ufinterface.getAttribute("filename"));
        xmlInfo.put("proc", ufinterface.getAttribute("proc"));
        xmlInfo.put("operation", ufinterface.getAttribute("operation"));
        Element voucherHead = (Element) doc.getElementsByTagName("voucher_head").item(0);
        NodeList childNodes = voucherHead.getChildNodes();
        // 存储voucher_head标签中的所有子元素的值
        for (int i = 0; i < childNodes.getLength(); i++) {
            if (childNodes.item(i) instanceof Element) {
                Element childElement = (Element) childNodes.item(i);
                xmlInfo.put(childElement.getTagName(), childElement.getTextContent());
            }
        }
        return xmlInfo;
    }
}
package com.lune.readxmlUtils;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

public class newXml {
    public static void main(String[] args) {
        try {
            File xmlFile = new File("C:\\Users\\14549\\Desktop\\compare\\newXml.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            doc.getDocumentElement().normalize();
            //  todo 处理 ufinterface
            Map<String, String> resultMap = getUfinterfaceHead(doc);
            // 输出Map中的所有属性名和属性值
            System.out.println("Properties in the Map:");
            for (Map.Entry<String, String> entry : resultMap.entrySet()) {
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }
            //    todo 处理 vouchers
            List<Map<String, String>> vouchers = getVoucher(doc);
            // 打印结果
            for (Map<String, String> map : vouchers) {
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    System.out.println(entry.getKey() + ": " + entry.getValue());
                }
                System.out.println("---------------------------");
            }
            //  todo 对 pk_accasoa 进行分组,debitamount 和localdebitamount求出集合中数字之和
            Map<String, Double> sumOfAmounts = sumVouchers(vouchers);
            // 输出结果
            System.out.println("Sum of Amounts:");
            sumOfAmounts.forEach((key, value) -> System.out.println(key + ": " + value));


            //   todo 输出文件
            outPutFile01(resultMap,vouchers);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static Map<String, Double>  sumVouchers(List<Map<String, String>> vouchers) {
        // 分组并提取 debitamount 和 localdebitamount 到合适的集合
//        Map<String, List<Double>> groupedDebitAmount = vouchers.stream()
//                .collect(Collectors.groupingBy(
//                        voucher -> voucher.get("pk_accasoa"),
//                        Collectors.mapping(voucher -> Double.parseDouble(voucher.get("debitamount")), Collectors.toList())));
        // 创建一个存放每组和的集合
        Map<String, Double> sumOfAmounts = new HashMap<>();
        // 对每组的 debitamount 和 localdebitamount 求和并存放到合适的集合
        for (Map<String, String> voucher : vouchers) {
            String pkAccasoa = voucher.get("pk_accasoa");
            double debitAmount = Double.parseDouble(voucher.get("debitamount"));
            double localDebitAmount = Double.parseDouble(voucher.get("localdebitamount"));
            // 计算每组的和
            double sum = debitAmount + localDebitAmount;
            // 将每组的和存放到集合中
            if (sumOfAmounts.containsKey(pkAccasoa)) {
                double currentSum = sumOfAmounts.get(pkAccasoa);
                sumOfAmounts.put(pkAccasoa, currentSum + sum);
            } else {
                sumOfAmounts.put(pkAccasoa, sum);
            }
        }
        return  sumOfAmounts;
    }
    private static void outPutFile01(Map<String, String> resultMap, List<Map<String, String>> vouchers) {
        // 准备文件名
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
        String fileName = "output_" + dateFormat.format(new Date()) + ".txt";
        String filePath = "C:\\Users\\14549\\Desktop\\compare"; // 替换为实际的输出位置
        // 输出 voucherHead 和 voucherBody 到文件
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath + File.separator + fileName))) {
            // 输出 voucherHead
            writer.write("#### Voucher Head ####" + System.lineSeparator());
            for (Map.Entry<String, String> entry : resultMap.entrySet()) {
                writer.write(entry.getKey() + ": " + entry.getValue() + System.lineSeparator());
            }
            // 使用空行分隔 voucherHead 和 voucherBody
            writer.write(System.lineSeparator());
            // 输出 voucherBody
            writer.write("#### Voucher Body ####" + System.lineSeparator());
            for (Map<String, String> item : vouchers) {
                for (Map.Entry<String, String> entry : item.entrySet()) {
                    writer.write(entry.getKey() + ": " + entry.getValue() + System.lineSeparator());
                }
                writer.write("--------------------" + System.lineSeparator());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 打印输出文件位置
        System.out.println("输出文件位置: " + new File(filePath, fileName).getAbsolutePath());
    }
    private static Map<String, String>  getUfinterfaceHead(Document doc) {
        // 创建一个Map来存储XML中的所有信息
        Map<String, String> xmlInfo = new HashMap<>();
        // 存储XML声明中的版本和编码
        xmlInfo.put("xmlVersion", doc.getXmlVersion());
        xmlInfo.put("xmlEncoding", doc.getXmlEncoding());
        Element ufinterface = (Element) doc.getElementsByTagName("ufinterface").item(0);
        // 存储ufinterface标签中的属性值
        xmlInfo.put("account", ufinterface.getAttribute("account"));
        xmlInfo.put("billtype", ufinterface.getAttribute("billtype"));
        xmlInfo.put("businessunitcode", ufinterface.getAttribute("businessunitcode"));
        xmlInfo.put("filename", ufinterface.getAttribute("filename"));
        xmlInfo.put("groupcode", ufinterface.getAttribute("groupcode"));
        xmlInfo.put("isexchange", ufinterface.getAttribute("isexchange"));
        xmlInfo.put("orgcode", ufinterface.getAttribute("orgcode"));
        xmlInfo.put("reveiver", ufinterface.getAttribute("reveiver"));
        xmlInfo.put("repace", ufinterface.getAttribute("repace"));
        xmlInfo.put("roottag", ufinterface.getAttribute("roottag"));
        xmlInfo.put("sender", ufinterface.getAttribute("sender"));
        return xmlInfo;
    }
    private static List<Map<String, String>> getVoucher(Document doc) {
            NodeList voucherList = doc.getElementsByTagName("voucher");
            List<Map<String, String>> resultList = new ArrayList<>();
            for (int i = 0; i < voucherList.getLength(); i++) {
                Element voucherElement = (Element) voucherList.item(i);
                Map<String, String> resultMap = new HashMap<>();
                extractXmlData(voucherElement, resultMap);
                resultList.add(resultMap);
            }
            return resultList;
    }
//    todo 递归获取对应的数据
    private static void extractXmlData(Element element, Map<String, String> resultMap) {
        NodeList childNodes = element.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node node = childNodes.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                if (node.hasChildNodes() && (node.getChildNodes().getLength() == 1) && (node.getFirstChild().getNodeType() == Node.TEXT_NODE)) {
                    resultMap.put(node.getNodeName(), node.getFirstChild().getNodeValue());
                } else {
                    extractXmlData((Element) node, resultMap);
                }
            }
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值