C# XML文件导入识别
上传XML文件流
/// <summary>
/// xml模板
/// </summary>
public class XmlModel
{
/// <summary>
/// 级别(级别越大,则树形结构层级越高)
/// </summary>
public int Level { get; set; }
/// <summary>
/// 工程名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// xml节点
/// </summary>
public XmlNode Node { get; set; }
}
/// <summary>
/// xml导入
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public VMSharedBatch<VMPlannedCostExport> Import(VMSharedImportByProjectId args)
{
try
{
var caller = Caller.Current;
using var db = new DataContext();
args.ProjectId.LabelEx("项目标识").CheckRequiredEx();
var pmProject = DAProject.Instance.GetItem(caller, db, args.ProjectId);
if (pmProject == null) throw new BusinessException("项目不存在!");
var pmExportList = DAPlannedCostExport.Instance.FindList(caller, db, DDPlannedCostExport.FProjectId.WSEq(pmProject.FId));
if (pmExportList.Count > 0)
{
VMSharedBatchSubmit vmDeleteList = new VMSharedBatchSubmit();
vmDeleteList.List = new List<VMSharedSubmit>();
vmDeleteList.List.AddRange(pmExportList.Select(a => new VMSharedSubmit() { Id = a.FId,Version=a.FVersion }).ToList());
Delete(vmDeleteList);
}
if (args.Stream == null) throw new BusinessException("数据流为空!");
args.Stream.Seek(0, System.IO.SeekOrigin.Begin);
XmlDocument doc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释
try
{
XmlReader reader = XmlReader.Create(args.Stream, settings);
doc.Load(reader);
}
catch (System.Exception ex)
{
throw new BusinessException("文件流读取失败,失败理由:" + ex.Message + "!");
}
List<VMPlannedCostExportEdit> exportList = new List<VMPlannedCostExportEdit>();
//得到根节点Project
XmlNodeList nodeList = doc.SelectNodes("//GLJHZ");
if (nodeList != null)
{
foreach (XmlNode node in nodeList)
{
List<VMPlannedCostExportDetailEdit> detailList = new List<VMPlannedCostExportDetailEdit>();
//人工
XmlNode rgNote = node.SelectSingleNode("RG");
detailList.AddRange(XmlNodeConvertDetailList(rgNote));
//材料
XmlNode clNote = node.SelectSingleNode("CL");
detailList.AddRange(XmlNodeConvertDetailList(clNote));
//机械
XmlNode jxNote = node.SelectSingleNode("JX");
detailList.AddRange(XmlNodeConvertDetailList(jxNote));
//设备
XmlNode sbNote = node.SelectSingleNode("SB");
detailList.AddRange(XmlNodeConvertDetailList(sbNote));
List<XmlModel> parentNodes = GetNodeXPath(node);
var parentGuid = TopId;
int minLevel = parentNodes.Min(a => a.Level);
foreach (var item in parentNodes.OrderByDescending(a => a.Level))
{
VMPlannedCostExportEdit export = new VMPlannedCostExportEdit()
{
Id = NewId(caller),
ProjectId = args.ProjectId,
ParentId = parentGuid,
Name = item.Name,
XmlName = item.Node.Name,
XMLDate = item.Node.Attributes.ToJsonStringEx(),
DetailList = new List<VMPlannedCostExportDetailEdit>()
};
if (minLevel == item.Level) export.DetailList.AddRange(detailList);
var oldexport = exportList.Find(a => a.Name.EqualsEx(item.Name) && a.XmlName.Equals(item.Node.Name));
if (oldexport != null)
{
parentGuid = oldexport.Id;
}
else
{
parentGuid = export.Id;
exportList.Add(export);
}
}
}
}
VMSharedBatch<VMPlannedCostExportEdit> vmSave = new VMSharedBatch<VMPlannedCostExportEdit>();
vmSave.List.AddRange(exportList);
return Save(vmSave);
}
catch(Exception ex)
{
throw new BusinessException("导入失败,错误理由:" + ex.Message + "!");
}
}
/// <summary>
/// 节点转换明细列表
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public List<VMPlannedCostExportDetailEdit> XmlNodeConvertDetailList(XmlNode node)
{
string type = "";
switch (node.Name)
{
case "RG":
type = CDCbs.FCostType.Options.Labour;break;
case "CL":
type = CDCbs.FCostType.Options.Material; break;
case "ZYCL":
type = CDCbs.FCostType.Options.Material; break;
case "JX":
type = CDCbs.FCostType.Options.Other; break;
case "SB":
type = CDCbs.FCostType.Options.Material; break;
default:
type = "";break;
}
List<VMPlannedCostExportDetailEdit> detailList = new List<VMPlannedCostExportDetailEdit>();
if (node != null && node.HasChildNodes)
{
List<string> zyCodes = new List<string>();
if (node.Name.EqualsEx("CL"))
{
XmlNode zyclNote = node.ParentNode.ParentNode.SelectSingleNode("ZYCLSB");
if (zyclNote != null && zyclNote.HasChildNodes && zyclNote.SelectSingleNode("ZYCL") != null && zyclNote.SelectSingleNode("ZYCL").HasChildNodes)
{
XmlNodeList zyNodes = zyclNote.SelectSingleNode("ZYCL").ChildNodes;
for (int i = 0; i < zyNodes.Count; i++)
{
XmlNode zyNodeChild = zyNodes[i];
XmlElement zyElem = (XmlElement)zyNodeChild;
zyCodes.Add(zyElem.GetAttribute("BH").ToString());
}
}
}
XmlNodeList noteChilds = node.ChildNodes;
string primaryType = node.Name;
for (int i = 0; i < noteChilds.Count; i++)
{
XmlNode noteChild = noteChilds[i];
XmlElement elem = (XmlElement)noteChild;
if (node.Name.EqualsEx("CL") && zyCodes.Where(a => a.EqualsEx(elem.GetAttribute("BH").ToString())).Count() > 0) primaryType = "ZYCL";
else
{
primaryType = node.Name;
if (node.Name.EqualsEx("CL") && zyCodes.Count() == 0) primaryType = "ZYCL";
}
VMPlannedCostExportDetailEdit detail = new VMPlannedCostExportDetailEdit()
{
Type = type,
PrimaryType = primaryType,
Code = elem.GetAttribute("BH").ToString(),
PriceCode = elem.GetAttribute("JGBM").ToString(),
Name = elem.GetAttribute("MC").ToString(),
Spec = elem.GetAttribute("GG").ToString(),
Unit = elem.GetAttribute("DW").ToString(),
Quantity = elem.GetAttribute("SL").ToNullableDecimalEx(),
Price = elem.GetAttribute("JZDJ").ToNullableDecimalEx(),
ExcludedTaxPrice = elem.GetAttribute("BHSJZDJ").ToNullableDecimalEx(),
IncludedTaxPrice = elem.GetAttribute("HSJZDJ").ToNullableDecimalEx(),
RiskContractRange = elem.GetAttribute("FXCBFD").ToString(),
PreTaxPrice = elem.GetAttribute("SQDJ").ToNullableDecimalEx(),
VATRate = elem.GetAttribute("ZZSL").ToNullableDecimalEx(),
AfterTaxPrice = elem.GetAttribute("SHDJ").ToNullableDecimalEx(),
PreTaxTotalPrice = elem.GetAttribute("SQHJ").ToNullableDecimalEx(),
AfterTaxTotalPrice = elem.GetAttribute("SHHJ").ToNullableDecimalEx(),
Amount = elem.GetAttribute("JE").ToNullableDecimalEx(),
Rate = elem.GetAttribute("BL").ToNullableDecimalEx(),
PriceSource = elem.GetAttribute("JGLY").ToString(),
XMLDate = noteChild.Attributes.ToJsonStringEx()
};
detailList.Add(detail);
}
}
return detailList;
}
/// <summary>
/// 获取父节点
/// </summary>
/// <param name="xmlNode"></param>
/// <returns></returns>
public static List<XmlModel> GetNodeXPath(XmlNode xmlNode)
{
List<XmlModel> xmlModels = new List<XmlModel>();
XmlNode node = xmlNode;
int level = 1;
while (true)
{
if (node.ParentNode.Name != "#document")
{
var nodeName = node.ParentNode.Name;
var name = "";
XmlElement elem = (XmlElement)node.ParentNode;
switch (nodeName)
{
case "DWGC":
name = elem.GetAttribute("DWGCMC");break;
case "DXGC":
name = elem.GetAttribute("DXGCMC"); break;
case "GCZJZC":
name = "工程造价组成"; break;
case "GCZJWJ":
name = elem.GetAttribute("GCMC"); break;
default:
name = "";break;
}
XmlModel xmlModel = new XmlModel()
{
Level = level,
Name = name,
Node = node.ParentNode
};
xmlModels.Add(xmlModel);
level++;
}
else
{
return xmlModels;
}
node = node.ParentNode;
}
}

浙公网安备 33010602011771号