/// <summary> /// 获取表体中的所有的input和select标签的数据 /// </summary> /// <param name="doc"></param> /// <returns>按照通道+节点的方式返回</returns> public static Dictionary <int, DataValue> GetData(HtmlAgilityPack.HtmlDocument doc) { var data = new Dictionary <int, DataValue>(); int trCount = GetTBodyOfTR(doc); //最外层有几行 int tableCount = GetContainTable(doc); //内部包含几个table Dictionary <string, int> head = GetColName(doc); //列头的名称 Dictionary <int, HtmlAgilityPack.HtmlNodeCollection> tbodyOfInputAndSelect = GetTBodyOfInputAndSelect(doc); //列 foreach (var item in tbodyOfInputAndSelect.Keys) { HtmlAgilityPack.HtmlNodeCollection body = tbodyOfInputAndSelect[item]; List <MYData> list = new List <MYData>(); foreach (var b in body) { MYData mydata = new MYData(); mydata.id = b.Attributes["id"].Value; mydata.name = b.Attributes["name"].Value; mydata.columnNum = head[mydata.name]; //mydata.rowNum = GetRowNum(mydata.id); if (b.Name == "input") { if (b.Attributes["value"] != null) { mydata.value = b.Attributes["value"].Value; } } else if (b.Name == "select") { var nodes = b.ChildNodes .Where(w => (w.Name == "option" && w.Attributes["selected"] != null)) .Select(s => s.Attributes["value"].Value).FirstOrDefault(); string node = string.Empty; if (null == (nodes)) { mydata.value = b.ChildNodes .Where(w => (w.Name == "option")) .Select(s => s.Attributes["value"].Value).First(); } else { mydata.value = nodes; } } if (string.IsNullOrWhiteSpace(b.ParentNode.GetAttributeValue("rowspan", string.Empty))) { mydata.mergedRowNum = 1; } else { if (tableCount == 6) { if (mydata.id == "READVALUE_1_1_1") { var tr = 1; string xpath = @"//table[@id='tongdao_1']//tbody[@class='myliangcheng_1']/tr | //table[@id='tongdao_1']//tbody[@class='myliangcheng_2']/tr"; var node = b.SelectNodes(xpath); if (node != null) { tr = node.Count; } mydata.mergedRowNum = tr; } else if (mydata.id == "READVALUE_1_3_1") { var tr = 1; string xpath = @"//table[@id='tongdao_1']//tbody[@class='myliangcheng_3']/tr | //table[@id='tongdao_1']//tbody[@class='myliangcheng_4']/tr"; var node = b.SelectNodes(xpath); if (node != null) { tr = node.Count; } mydata.mergedRowNum = tr; } else if (mydata.id == "READVALUE_1_5_1") { var tr = 1; string xpath = @"//table[@id='tongdao_1']//tbody[@class='myliangcheng_5']/tr | //table[@id='tongdao_1']//tbody[@class='myliangcheng_6']/tr"; var node = b.SelectNodes(xpath); if (node != null) { tr = node.Count; } mydata.mergedRowNum = tr; } else if (mydata.name == "ACTUALVALUE") { var tr = 1; string xpath = @"../parent::*/child::td/table/tbody/tr"; var node = b.SelectNodes(xpath); if (node != null) { tr = node.Count; } mydata.mergedRowNum = tr; } else { int row = int.Parse(b.ParentNode.GetAttributeValue("rowspan", string.Empty)); mydata.mergedRowNum = row; } } else { int row = int.Parse(b.ParentNode.GetAttributeValue("rowspan", string.Empty)); if (row > 1) { var tr = 1; var node = b.SelectNodes("../parent::*/parent::tbody/tr"); if (node != null) { tr = node.Count; } //谁小就是谁 mydata.mergedRowNum = (tr > row) ? row : tr; } else { mydata.mergedRowNum = 1; } } } list.Add(mydata); } var q = from p in list group p by p.name into g select new KeyValue() { Key = g.Key, Value = g.Sum(p => p.mergedRowNum) }; var max = q.Select(s => s.Value).Max(m => m); var dat = from f in q where f.Value < max select f.Key; if (tableCount > 0) { //表格嵌套 var change = from f in list where dat.Contains(f.name) select f; foreach (var it in change) { //不平衡负载时有功电能误差 if (it.mergedRowNum > 1) { if (tableCount == 6) { if (it.mergedRowNum == 6) { it.mergedRowNum = max; } } else { throw new System.Exception("我没有遇到这要的情况"); } } else { it.mergedRowNum = max; } } } else { if (dat != null && dat.Count() > 0) { throw new System.Exception("估计要出错,因为所有列的行数不一样"); } } data.Add(item, new DataValue() { Count = max, Data = list }); } return(data);// }
/// <summary> /// 不确定解析 /// </summary> /// <param name="url"></param> /// <returns></returns> private static BuDueDingDu GetBuDueDingDu(string url) { BuDueDingDu buDueDingDu = new BuDueDingDu(); try { docBuQueDingDu.Load(url); string xpath = @"//select[@tag='only']"; var allselected = docBuQueDingDu.DocumentNode.SelectNodes(xpath); foreach (var b in allselected) { var nodes = b.ChildNodes .Where(w => (w.Name == "option" && w.Attributes["selected"] != null)) .Select(s => s.Attributes["value"].Value).FirstOrDefault(); string node = string.Empty; if (null == (nodes)) { node = b.ChildNodes .Where(w => (w.Name == "option")) .Select(s => s.Attributes["value"].Value).First(); } else { node = nodes; } if (node != null) { if (b.Attributes["id"].Value == "pdDDL") { buDueDingDu.pdDDL = node; } else if (b.Attributes["id"].Value == "ddlSelectD") { buDueDingDu.ddlSelectD = node; } else if (b.Attributes["id"].Value == "ddlUA") { buDueDingDu.ddlUA = node; } else if (b.Attributes["id"].Value == "ddlUB") { buDueDingDu.ddlUB = node; } else if (b.Attributes["id"].Value == "ddlUC") { buDueDingDu.ddlUC = node; } else if (b.Attributes["id"].Value == "ddlUrel") { buDueDingDu.ddlUrel = node; } } } var xpathA = @"//input[@tag='only']"; var A = docBuQueDingDu.DocumentNode.SelectNodes(xpathA); foreach (var item in A) { if (item.Attributes["id"].Value == "pdText") { buDueDingDu.pdText = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "txtBuQueDingA") { buDueDingDu.txtBuQueDingA = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "txtValue") { buDueDingDu.txtValue = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_1_1") { buDueDingDu.A_1_1 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_1_2") { buDueDingDu.A_1_2 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_1_3") { buDueDingDu.A_1_3 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_1_4") { buDueDingDu.A_1_4 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_1_5") { buDueDingDu.A_1_5 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_2_1") { buDueDingDu.A_2_1 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_2_2") { buDueDingDu.A_2_2 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_2_3") { buDueDingDu.A_2_3 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_2_4") { buDueDingDu.A_2_4 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "A_2_5") { buDueDingDu.A_2_5 = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "txtBuQueDingB") { buDueDingDu.txtBuQueDingB = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "txtValueB") { buDueDingDu.txtValueB = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "txtBuQueDingC") { buDueDingDu.txtBuQueDingC = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "txtvalueD") { buDueDingDu.txtvalueD = item.Attributes["value"].Value; } else if (item.Attributes["id"].Value == "txtValueE") { buDueDingDu.txtValueE = item.Attributes["value"].Value; } } Dictionary <string, int> head = new Dictionary <string, int>(); head.Add("pingding1", 1); head.Add("pingding2", 2); head.Add("pingding3", 3); double i = 0; var xpathpingding = @"//ul[@tag='pingding']//input[@type='text'] | //ul[@tag='pingding']//select"; var pingding = docBuQueDingDu.DocumentNode.SelectNodes(xpathpingding); if (pingding == null) { } else { List <MYData> list = new List <MYData>(); foreach (var b in pingding) { i++; MYData mydata = new MYData(); mydata.id = b.Attributes["id"].Value; mydata.name = b.Attributes["name"].Value; mydata.columnNum = head[mydata.name]; //mydata.rowNum = int.Parse(System.Math.Ceiling((i / 3)).ToString()); if (b.Name == "input") { if (b.Attributes["value"] != null) { mydata.value = b.Attributes["value"].Value; } } else if (b.Name == "select") { var nodes = b.ChildNodes .Where(w => (w.Name == "option" && w.Attributes["selected"] != null)) .Select(s => s.Attributes["value"].Value).FirstOrDefault(); if (null == (nodes)) { mydata.value = b.ChildNodes .Where(w => (w.Name == "option")) .Select(s => s.Attributes["value"].Value).First(); } else { mydata.value = nodes; } } list.Add(mydata); } buDueDingDu.pingding = list; Dictionary <string, int> headb = new Dictionary <string, int>(); headb.Add("B_PingDing", 1); headb.Add("B_WuChaLaiYuan", 2); headb.Add("sourceNum", 3); headb.Add("B_WuChaXian", 4); headb.Add("B_WuChaXian_UNIT", 5); headb.Add("B_WuChaFenBu", 6); headb.Add("B_K", 7); headb.Add("B_Ui", 8); headb.Add("B_Ui_UNIT", 9); double ib = 0; var xpathpingdingb = @"//tbody[@id='buquedingdub']//input[@type='text']"; var pingdingb = docBuQueDingDu.DocumentNode.SelectNodes(xpathpingdingb); if (pingdingb == null) { } else { List <MYData> listb = new List <MYData>(); foreach (var b in pingdingb) { ib++; if (ib <= 9)//第一行数据隐藏数据不要打印 { continue; } MYData mydata = new MYData(); mydata.id = b.Attributes["id"].Value; mydata.name = b.Attributes["name"].Value; mydata.columnNum = headb[mydata.name]; //mydata.rowNum = int.Parse(System.Math.Ceiling((ib / 3)).ToString()); if (b.Name == "input") { if (b.Attributes["value"] != null) { mydata.value = b.Attributes["value"].Value; } } listb.Add(mydata); } buDueDingDu.buDueDingDuB = listb; } } } catch (Exception ex) { buDueDingDu = null; } return(buDueDingDu); }