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

  

posted @ 2022-09-06 16:31  冷鳯  阅读(142)  评论(0)    收藏  举报