public bool getXmlData(ref XmlDocument retdoc, ref XmlDocument xmlschemaDoc, ref string msg, bool onlyFirstPage = true, bool onlyOrgData = false) { JdUnion_Bussiness_Class jdyreq = this; string strDefaultName = "DataTable1"; string strRootName = "NewDataSet"; string ret = null; XmlDocument doc = new XmlDocument(); if (xmlschemaDoc == null) { xmlschemaDoc = new XmlDocument(); } msg = null; try { //jdyreq.InitClass(jdyreq.Module); jdyreq.sign = null; if (jdyreq is JdUnion_Bussiness_List_Class) { (jdyreq as JdUnion_Bussiness_List_Class).RequestSizeAndPage((jdyreq as JdUnion_Bussiness_List_Class).pager.pageSize, 1, null); } jdyreq.InitRequestJson(); ret = jdyreq.GetRequest(); xmlschemaDoc = jdyreq.getRequestSchema(); XmlSchemaClass xmlSchema = new XmlSchemaClass(xmlschemaDoc); //string strXml = XML_JSON.Json2XML(ret); XmlDocument tmp = jdyreq.getRealXml(ret, out msg); if (msg != null) { return(false); } doc.LoadXml(tmp.OuterXml); if (onlyOrgData) { if (retdoc == null) { retdoc = new XmlDocument(); } retdoc.LoadXml(tmp.OuterXml); return(true); } if (jdyreq is JdUnion_Bussiness_List_Class) { if (onlyFirstPage) { return(getXmlDataSet(doc, xmlSchema, ref retdoc, ref msg)); //return true; } //return true; } else { return(getXmlDataSet(doc, xmlSchema, ref retdoc, ref msg)); } int?totalCount = XmlNodeIntVal(doc, xmlSchema.rootNodePath, xmlSchema.totalCountItemName); //, //int.Parse(XmlUtil.GetSubNodeText(tmp, xmlSchema.pageCountItemName)); int?totalsize = XmlNodeIntVal(doc, xmlSchema.rootNodePath, xmlSchema.pageSizeItemName); if (totalsize == null) { totalsize = (this as JdUnion_Bussiness_List_Class).pager.pageSize;//按实际返回的数量计算页大小 } int totalPage = (totalCount.Value / totalsize.Value) + ((totalCount.Value % totalsize.Value) == 0 ? 0 : 1); if (totalPage > 1)//如果不止一页 { XmlNode rootnode = doc.SelectSingleNode(xmlSchema.rootNodePath); for (int i = 2; i <= totalPage; i++) { (jdyreq as JdUnion_Bussiness_List_Class).RequestSizeAndPage((this as JdUnion_Bussiness_List_Class).pager.pageSize, i, null); jdyreq.sign = null;//必须重置 jdyreq.InitRequestJson(); ret = jdyreq.GetRequest(); XmlDocument ntmp = jdyreq.getRealXml(ret, out msg); if (msg != null) { continue; //return false; } string xpath = string.Format("{0}/{1}", xmlSchema.rootNodePath, xmlSchema.dataItemName); foreach (XmlNode node in ntmp.SelectNodes(xpath))//子节点全部加入根结点 { rootnode.AppendChild(doc.ImportNode(node, true)); } } } return(getXmlDataSet(doc, xmlSchema, ref retdoc, ref msg)); } catch (Exception e) { msg = e.Message; return(false); } //return true; }
bool getXmlDataSet(XmlDocument xmldoc, XmlSchemaClass xmlSchema, ref XmlDocument retDoc, ref string msg) { if (xmlSchema == null) { retDoc = xmldoc; } retDoc = new XmlDocument(); Dictionary <string, TableGuider> tablist = xmlSchema.TableList; retDoc.LoadXml("<NewDataSet/>"); if (xmldoc == null) { return(false); } try { if (tablist.Count == 0) { msg = "未指定指引配置!"; return(false); } TableGuider tg = tablist.First().Value; if (tg == null) { msg = "未配置表结构!"; return(false); } List <TableGuider> subtabs = tablist.Values.Skip(1).ToList(); string mainname = tg.TableName; XmlNode rootnode = retDoc.SelectSingleNode("NewDataSet"); if (string.IsNullOrEmpty(mainname)) { msg = "指定指引中主表名未配置!"; return(false); } XmlNamespaceManager xmlm = new XmlNamespaceManager(xmldoc.NameTable); xmlm.AddNamespace("json", "http://james.newtonking.com/projects/json");//添加命名空间 XmlNode root = xmldoc.SelectSingleNode(tg.rootNodePath); XmlNodeList itemnodes = root.SelectNodes(tg.dataItemName); string message = XmlUtil.GetSubNodeText(root, tg.msgItemName); if (!string.IsNullOrEmpty(message)) { if (message.Trim() != "success" && message.Trim() != "接口成功") { msg = message; return(false); } } foreach (XmlNode dataNode in itemnodes) { string submsg = null; if (XmlUtil.GetSubNodeText(itemnodes[0], tg.msgItemName) != "" && XmlUtil.GetSubNodeText(dataNode, tg.msgItemName) != "0") { submsg = XmlUtil.GetSubNodeText(dataNode, tg.msgItemName); msg = submsg; return(false); } //XmlNode NewRow = xmldoc.CreateElement(mainname, xmlm.LookupNamespace("json")); XmlNode NewRow = retDoc.CreateElement(mainname); //XmlAttribute att = xmldoc.CreateAttribute("json:Array", xmlm.LookupNamespace("json")); //att.Value = "true"; //NewRow.Attributes.Append(att); string tableKey = tg.Key; string keyValue = null; if (tg.Columns.Count > 0) { foreach (string key in tg.Columns.Keys) { ResponseDataColumn rdc = tg.Columns[key]; XmlNode cellNode = retDoc.CreateElement(key); if (!rdc.outXml) { cellNode.InnerText = XmlUtil.GetSubNodeText(dataNode, rdc.xPath); } else { //System.Web.HttpUtility.UrlEncode string strOutXml = HttpUtility.HtmlEncode(dataNode.SelectSingleNode(rdc.xPath)?.OuterXml); cellNode.InnerXml = strOutXml; } if (key == tableKey) { keyValue = cellNode.InnerText; } NewRow.AppendChild(cellNode); } } rootnode.AppendChild(NewRow); for (int i = 0; i < subtabs.Count; i++) { TableGuider stg = subtabs[i]; string sItemPath = string.Format("{0}/{1}", stg.rootNodePath, stg.dataItemName); XmlNodeList sDataNodes = dataNode.SelectNodes(sItemPath); if (sDataNodes.Count == 0) { continue; } XmlNode subTableRow = retDoc.CreateElement(stg.TableName); foreach (XmlNode sitem in sDataNodes) { if (stg.Columns.Count > 0) { bool ExistKey = false; bool ExistKeyItem = false; foreach (string key in stg.Columns.Keys) { ResponseDataColumn rdc = stg.Columns[key]; XmlNode cellNode = retDoc.CreateElement(key); if (!rdc.outXml) { cellNode.InnerText = XmlUtil.GetSubNodeText(dataNode, rdc.xPath); } else { cellNode.InnerXml = XmlUtil.GetSubNodeXml(dataNode, rdc.xPath); } subTableRow.AppendChild(cellNode); if (key == tableKey) { ExistKeyItem = true; if (cellNode.InnerText == keyValue) { ExistKey = true; } } } XmlNode keyNode = null; if (ExistKeyItem) //存在键项 { if (!ExistKey) //存在同名键,另外新建一个表名_健名,如果虚拟键恰巧存在就通过修改表名避免 { string parentKey = string.Format("{0}_{1}", tg.TableName, tableKey); XmlNode virtualKeyNode = retDoc.CreateElement(parentKey); virtualKeyNode.InnerText = keyValue; subTableRow.AppendChild(virtualKeyNode); } } else //没有存在键相,直接插入一个 { keyNode = retDoc.CreateElement(tableKey); keyNode.InnerText = keyValue; subTableRow.AppendChild(keyNode); } } } rootnode.AppendChild(subTableRow); } } return(true); } catch (Exception ce) { msg = string.Format("{0}[{1}]", ce.Message, ce.StackTrace); return(false); } }
public virtual bool getBusynessXmlData(XmlNode condition, ref XmlDocument retdoc, ref XmlDocument xmlschemaDoc, ref string msg, bool onlyFirstPage = true, bool onlyOrgData = false) { if (condition == null) { return(getXmlData(ref retdoc, ref xmlschemaDoc, ref msg, onlyFirstPage, onlyOrgData)); } //c[@i @f @r @v @o @s] try { XmlNodeList nodes = condition.SelectNodes("c[@o!='in']"); XmlNodeList inNodes = condition.SelectNodes("req/c[@o='in']"); if (inNodes.Count > 1) { msg = "不支持多个内含条件!"; return(false); } string forName = XmlUtil.GetSubNodeText(inNodes[0], "@i"); string vals = XmlUtil.GetSubNodeText(inNodes[0], "@v"); string sp = XmlUtil.GetSubNodeText(inNodes[0], "@s"); if (string.IsNullOrEmpty(sp))//默认用,分割 { sp = ","; } if (inNodes.Count > 0 && (string.IsNullOrEmpty(forName) || string.IsNullOrEmpty(vals))) { msg = "内含条件名称和值不能为空!"; return(false); } XmlSchemaClass schema = null; XmlNode rootNode = null; string strRootName = "NewDataSet"; string[] arr = vals.Split(sp.ToCharArray()); for (int i = 0; i < arr.Length; i++) { if (string.IsNullOrEmpty(forName) == false) { setBussiessItems(forName, arr[i]); } foreach (XmlNode node in nodes) { string pointName = XmlUtil.GetSubNodeText(node, "@i"); string opt = XmlUtil.GetSubNodeText(node, "@o"); string val = XmlUtil.GetSubNodeText(node, "@v"); if (string.IsNullOrEmpty(pointName) || string.IsNullOrEmpty(val)) { continue; } if (string.IsNullOrEmpty(opt)) { opt = "="; } if (opt == "=") { setBussiessItems(pointName, val); } } XmlDocument xmldoc = null; XmlDocument xmlschema = null; bool succ = getXmlData(ref xmldoc, ref xmlschema, ref msg, false); if (succ == false) { if (msg != null) { } continue; } if (schema == null) { schema = new XmlSchemaClass(xmlschema); xmlschemaDoc = xmlschema; } if (retdoc == null) { retdoc = xmldoc; rootNode = retdoc.SelectSingleNode(strRootName); } else //把新的节点全部复制过去 { foreach (string key in schema.TableList.Keys) { string xpath = string.Format("{0}/{1}", strRootName, key); foreach (XmlNode node in xmldoc.SelectNodes(xpath)) { rootNode.AppendChild(retdoc.ImportNode(node, true)); } } } } } catch (Exception e) { msg = e.Message; return(false); } return(true); }