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);
}
}
}
}
}