package com.whyc.dto;
|
|
|
import com.whyc.pojo.*;
|
import org.dom4j.Document;
|
import org.dom4j.DocumentException;
|
import org.dom4j.Element;
|
import org.dom4j.Node;
|
import org.dom4j.io.OutputFormat;
|
import org.dom4j.io.SAXReader;
|
import org.dom4j.io.XMLWriter;
|
|
import java.io.*;
|
import java.text.ParseException;
|
import java.util.*;
|
|
public class XmlFileOpreate {
|
//解析FBR-6000NT基础2.7
|
public static FileInfo readFBR_6000NT_jc(String xmlFilePath){
|
FileInfo fileInfo=new FileInfo();//文件信息
|
FileParam fparam=fileInfo.getFileParam();//文件参数
|
boolean res = true;
|
try
|
{
|
SAXReader reader = new SAXReader();
|
FileInputStream fiso=new FileInputStream(xmlFilePath);
|
Document document = reader.read(fiso);
|
Element rootnode = document.getRootElement();
|
|
Element node;//根节点
|
Element file_node;//文件节点
|
|
//------------------------------------------------------------//
|
node = rootnode.element("TEST_TIME");
|
String testTime=node.getTextTrim();
|
testTime=testTime.replace("_"," ");
|
fparam.setTestTime(ActionUtil.sdfwithALL.parse(testTime));
|
//------------------------------------------------------------//
|
node = rootnode.element("VERSION");
|
fparam.setVersion(node.getTextTrim());
|
//------------------------------------------------------------//
|
node = rootnode.element("BATT_PARAM");
|
file_node=node.element("batt_group_name");
|
fparam.setBattGroupName(file_node.getTextTrim());
|
|
file_node=node.element("batt_producer");
|
if(file_node!=null){
|
fparam.setBattProducer(file_node.getTextTrim());
|
}
|
file_node=node.element("batt_cap");
|
fparam.setBattCap(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("batt_count");
|
fparam.setBattCount(Integer.parseInt(file_node.getTextTrim()));
|
|
file_node=node.element("batt_vol");
|
fparam.setBattVol(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("batt_vol_good");
|
if(file_node!=null){
|
fparam.setBattVolGood(Float.parseFloat(file_node.getTextTrim()));
|
}
|
file_node=node.element("batt_vol_bad");
|
if(file_node!=null){
|
fparam.setBattVolBad(Float.parseFloat(file_node.getTextTrim()));
|
}
|
|
file_node=node.element("batt_res");
|
if(file_node!=null){
|
fparam.setBattRes(Float.parseFloat(file_node.getTextTrim()));
|
}else{
|
fparam.setBattRes(0f);
|
}
|
|
file_node=node.element("batt_res_good");
|
if(file_node!=null){
|
fparam.setBattResGood(Float.parseFloat(file_node.getTextTrim()));
|
}
|
file_node=node.element("batt_res_bad");
|
if(file_node!=null){
|
fparam.setBattResBad(Float.parseFloat(file_node.getTextTrim()));
|
}
|
|
file_node=node.element("batt_ser");
|
fparam.setBattSer(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("batt_ser_good");
|
if(file_node!=null){
|
fparam.setBattSerGood(Float.parseFloat(file_node.getTextTrim()));
|
}
|
file_node=node.element("batt_ser_bad");
|
if(file_node!=null){
|
fparam.setBattSerBad(Float.parseFloat(file_node.getTextTrim()));
|
}
|
|
file_node=node.element("concount_pb");
|
fparam.setConcountPb(Integer.parseInt(file_node.getTextTrim()));
|
|
file_node=node.element("conn_res");
|
if(file_node!=null){
|
fparam.setConnRes(Float.parseFloat(file_node.getTextTrim()));
|
}
|
file_node=node.element("conn_res_good");
|
if(file_node!=null){
|
fparam.setConnResGood(Float.parseFloat(file_node.getTextTrim()));
|
}
|
file_node=node.element("conn_res_bad");
|
if(file_node!=null){
|
fparam.setConnResBad(Float.parseFloat(file_node.getTextTrim()));
|
}
|
|
float battCap=fparam.getBattCap();//标称容量
|
float battRes=fparam.getBattRes();//标称内阻
|
//-----根据groupNum的值读取测试数据---------------------------//
|
Iterator nodes = rootnode.elementIterator("node_batt_num");
|
BattgroupInfo battInfo=new BattgroupInfo();
|
List<BattgroupData> battDataList=new ArrayList();
|
List<Float> list=new ArrayList();//存放所有的内阻数据
|
if(nodes!=null){
|
while (nodes.hasNext()){
|
node= (Element) nodes.next();
|
BattgroupData battData=new BattgroupData();
|
battData.setMonNum(Integer.parseInt(node.attributeValue("batt_num")));
|
file_node=node.element("bv_1");
|
battData.setBv(file_node.getTextTrim());
|
file_node=node.element("br_1");
|
String br=file_node.getTextTrim();
|
battData.setBr(br);
|
float esCap=0f;
|
if(battRes==0){
|
esCap=1;
|
}else{
|
esCap=battRes/Float.valueOf(br);
|
}
|
battData.setEstimatedCap(esCap*battCap);
|
battData.setBr(br);
|
file_node=node.element("bs_1");
|
battData.setBs(file_node.getTextTrim());
|
file_node=node.element("cr_1");
|
battData.setCr(file_node.getTextTrim());
|
battDataList.add(battData);
|
list.add(Float.valueOf(battData.getBr()));
|
}
|
}
|
battInfo.setBattDataList(battDataList);
|
battInfo.setTestTime(ActionUtil.sdfwithALL.parse(testTime));
|
fileInfo.getBattInfoList().add(battInfo);
|
//当标称内阻为0时,计算最低三分之一单体数内阻数据的平均值
|
if(fparam.getBattRes()==0){
|
if(list!=null&&list.size()>0){
|
int battNum= (int) Math.ceil(list.size()/3);
|
float resSum=0f;
|
Collections.sort(list);
|
System.out.println(list.toString());
|
for(int i=0;i<battNum;i++){
|
resSum=resSum+list.get(i);
|
}
|
String avgRes=String.format("%.2f",resSum/battNum);
|
fparam.setBattRes(Float.valueOf(avgRes));
|
}
|
}
|
fileInfo.setFileParam(fparam);
|
fiso.close();
|
} catch (NullPointerException | NumberFormatException | DocumentException | ParseException | FileNotFoundException e) {
|
res = false;
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
} finally {
|
if(false == res)
|
return null;
|
}
|
return fileInfo;
|
}
|
//解析FBR-6000NT带标记版本2.0
|
public static FileInfo readFBR_6000NT_bj(String xmlFilePath){
|
boolean res = true;
|
FileInfo fileInfo=new FileInfo();//文件信息
|
FileParam fparam=fileInfo.getFileParam();//文件参数
|
try
|
{
|
SAXReader reader = new SAXReader();
|
FileInputStream fiso=new FileInputStream(xmlFilePath);
|
Document document = reader.read(fiso);
|
Element rootnode = document.getRootElement();
|
|
Element node;//根节点
|
Element file_node;//文件节点
|
Element batt_node;//电池节点
|
|
//------------------------------------------------------------//
|
node = rootnode.element("TEST_TIME");
|
String testTime=node.getTextTrim();
|
testTime.replace("_"," ");
|
fparam.setTestTime(ActionUtil.sdfwithALL.parse(testTime));
|
//------------------------------------------------------------//
|
node = rootnode.element("VERSION");
|
fparam.setVersion(node.getTextTrim());
|
//------------------------------------------------------------//
|
node = rootnode.element("BATT_PARAM");
|
file_node=node.element("uploadTime");
|
String uploadTime=file_node.getTextTrim();
|
if(!uploadTime.equals("null")){
|
fparam.setUploadTime(ActionUtil.sdfwithALL.parse(uploadTime));
|
}
|
file_node=node.element("uploadflag");
|
fparam.setUploadFlag(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("sysID");
|
fparam.setSysId(file_node.getTextTrim());
|
file_node=node.element("batt_group_name");
|
fparam.setBattGroupName(file_node.getTextTrim());
|
file_node=node.element("battBrand");
|
fparam.setBattBrand(file_node.getTextTrim());
|
file_node=node.element("battModel");
|
fparam.setBattModel(file_node.getTextTrim());
|
file_node=node.element("battBatch");
|
fparam.setBattBatch(file_node.getTextTrim());
|
file_node=node.element("battStation");
|
fparam.setBattStation(file_node.getTextTrim());
|
file_node=node.element("battlineName");
|
fparam.setBattlineName(file_node.getTextTrim());
|
file_node=node.element("battTHA");
|
fparam.setBattTha(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("battErrFlag");
|
fparam.setBattErrflag(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("battTestNum");
|
fparam.setBattTestnum(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("battFaultNum");
|
fparam.setBattFaultnum(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("batt_cap");
|
fparam.setBattCap(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("batt_count");
|
fparam.setBattCount(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("batt_vol");
|
fparam.setBattVol(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("batt_res");
|
if(file_node!=null){
|
fparam.setBattRes(Float.parseFloat(file_node.getTextTrim()));
|
}else{
|
fparam.setBattRes(0f);
|
}
|
|
file_node=node.element("gropNum");
|
fparam.setGroupNum(Integer.parseInt(file_node.getTextTrim()));
|
|
//------------------------------------------------------------//
|
node = rootnode.element("TEST_PARAM");
|
file_node=node.element("VolLowCoeK1");
|
fparam.setVolLowCoeK1(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("VolHighCoeK2");
|
fparam.setVolHighCoeK2(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("ResGoodCoeK3");
|
fparam.setResGoodCoeK3(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("ResBadCoeK4");
|
fparam.setResBadCoeK4(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("sample_percent");
|
fparam.setSamplePercent(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("HighTempAlarm");
|
fparam.setHighTempAlarm(Integer.parseInt(file_node.getTextTrim()));
|
file_node=node.element("ChainRes");
|
fparam.setChainRes(Float.parseFloat(file_node.getTextTrim()));
|
file_node=node.element("evaluation_mode");
|
fparam.setEvaluationMode(Integer.parseInt(file_node.getTextTrim()));
|
|
//查询出当前最大电池组id
|
//System.out.println("groupName:"+fparam.getGroupNum()+" battCount:"+fparam.getBattCount());
|
|
//-----根据groupNum的值读取测试数据---------------------------//
|
Iterator nodes = rootnode.elementIterator("node_group_num");
|
|
float battCap=fparam.getBattCap();//标称容量
|
float battRes=fparam.getBattRes();//标称内阻
|
|
if(nodes!=null){
|
while (nodes.hasNext()){
|
node= (Element) nodes.next();
|
Iterator iterator1 = node.elementIterator();
|
BattgroupInfo battInfo=new BattgroupInfo();
|
List<BattgroupData> battDataList=new ArrayList();
|
List<Float> list=new ArrayList();//存放所有的内阻数据
|
while (iterator1.hasNext()){
|
file_node= (Element) iterator1.next();
|
BattgroupData battData=new BattgroupData();
|
battData.setMonNum(Integer.parseInt(file_node.attributeValue("batt_num")));
|
batt_node=file_node.element("bv_1");
|
battData.setBv(batt_node.getTextTrim());
|
batt_node=file_node.element("br_1");
|
String br=batt_node.getTextTrim();
|
battData.setBr(br);
|
float esCap=0f;
|
if(battRes==0){
|
esCap=1;
|
}else{
|
esCap=battRes/Float.valueOf(br);
|
}
|
battData.setEstimatedCap(esCap*battCap);
|
batt_node=file_node.element("bs_1");
|
battData.setBs(batt_node.getTextTrim());
|
batt_node=file_node.element("cr_1");
|
battData.setCr(batt_node.getTextTrim());
|
batt_node=file_node.element("er_1");
|
battData.setEr(Integer.parseInt(batt_node.getTextTrim()));
|
battDataList.add(battData);
|
list.add(Float.valueOf(battData.getBr()));
|
}
|
battInfo.setTestTime(ActionUtil.sdfwithALL.parse(testTime));
|
battInfo.setBattDataList(battDataList);
|
fileInfo.getBattInfoList().add(battInfo);
|
//当标称内阻为0时,计算最低三分之一单体数内阻数据的平均值
|
if(fparam.getBattRes()==0){
|
if(list!=null&&list.size()>0){
|
int battNum= (int) Math.ceil(list.size()/3);
|
float resSum=0f;
|
Collections.sort(list);
|
for(int i=0;i<battNum;i++){
|
resSum=resSum+list.get(i);
|
}
|
String avgRes=String.format("%.2f",resSum/battNum);
|
fparam.setBattRes(Float.valueOf(avgRes));
|
}
|
}
|
}
|
}
|
fileInfo.setFileParam(fparam);
|
fiso.close();
|
} catch (NullPointerException | NumberFormatException | DocumentException | ParseException | FileNotFoundException e) {
|
res = false;
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
} finally {
|
if(false == res)
|
return null;
|
}
|
return fileInfo;
|
}
|
//解析xml文件
|
public static FileInfo readXml(String xmlFilePath)
|
{
|
FileInfo fileInfo=new FileInfo();
|
try
|
{
|
SAXReader reader = new SAXReader();
|
FileInputStream fiso=new FileInputStream(xmlFilePath);
|
Document document = reader.read(fiso);
|
Element rootnode = document.getRootElement();
|
|
//------------------------------------------------------------//
|
Element node = rootnode.element("VERSION");
|
if(node!=null){
|
String version=node.getTextTrim();
|
switch (version){
|
case "V2.0": fileInfo=readFBR_6000NT_bj(xmlFilePath);break;
|
case "V2.7": fileInfo=readFBR_6000NT_jc(xmlFilePath);break;
|
default:fileInfo=readFBR_6000NT_bj(xmlFilePath);break;
|
}
|
}
|
fiso.close();
|
} catch (NullPointerException | NumberFormatException | DocumentException | FileNotFoundException e) {
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return fileInfo;
|
}
|
|
public static boolean writeXml( Map<String,String> map,String xmlFilePath){
|
boolean res=true;
|
try {
|
SAXReader reader = new SAXReader();
|
FileInputStream fiso= new FileInputStream(xmlFilePath);
|
Document document = reader.read(fiso);
|
|
for (Map.Entry<String, String> entry:map.entrySet()) {
|
String mapKey = entry.getKey();
|
String mapValue = entry.getValue();
|
//System.out.println(mapKey+":"+mapValue);
|
//得到第一个mapKey节点
|
Node node=document.selectSingleNode("//"+mapKey);
|
if(node!=null){
|
node.setText(mapValue);
|
}
|
}
|
OutputFormat format = OutputFormat.createPrettyPrint();
|
format.setEncoding("UTF-8");//默认的编码就是UTF-8
|
XMLWriter writer = new XMLWriter( new FileOutputStream(xmlFilePath), format );
|
writer.write( document );
|
writer.close();
|
fiso.close();
|
} catch (DocumentException | FileNotFoundException | UnsupportedEncodingException e) {
|
res = false;
|
e.printStackTrace();
|
} catch (IOException e) {
|
res = false;
|
e.printStackTrace();
|
}
|
return res;
|
}
|
|
public static void main(String[] args) {
|
String filePath="D:\\fileTest\\FBR-5000CT -原数据20221031\\\\2022-10-31_09-14-48.xml";
|
Map map=new HashMap() ;
|
FileInfo fileInfo=XmlFileOpreate.readXml(filePath);
|
System.out.println(fileInfo);
|
map.put("ChainRes", "50.0");
|
map.put("battTestNum","9");
|
map.put("battModel","SD-001");
|
map.put("batt_res","4.0");
|
map.put("ResBadCoeK4","1.6");
|
map.put("battlineName","一号线");
|
map.put("evaluation_mode","0");
|
map.put("TEST_TIME","2022-06-13 16:06:19");
|
map.put("battErrFlag","1");
|
map.put("gropNum","2");
|
map.put("VolHighCoeK2","1.2");
|
map.put("battBatch","20170602");
|
map.put("batt_vol","12.0");
|
map.put("batt_cap","100.0");
|
map.put("sysID","B20220613160151");
|
map.put("batt_count","24");
|
map.put("uploadflag","0");
|
map.put("uploadTime","null");
|
map.put("battTHA","0");
|
map.put("VolLowCoeK1","0.8");
|
map.put("battFaultNum","2");
|
map.put("HighTempAlarm","50");
|
map.put("VERSION","V2.0");
|
map.put("ResGoodCoeK3","1.25");
|
map.put("sample_percent","30");
|
map.put("VERSION","V2.0");
|
map.put("battBrand","双登lxw");
|
map.put("batt_group_name","后备电源室1#UPS系统lxw");
|
map.put("battStation","鼓楼站lxw");
|
|
//XmlFileOpreate.writeXml(map,filePath);
|
}
|
}
|