c#使用XmlDocument解析xml文件
1、示例xml文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <soap:Envelope 3 xmlns:xsi="http://ww.w3.org/2001/XMLSchema-instance" 4 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 5 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 6 <soap:Body> 7 <DataListResponse 8 xmlns="http://tempuri.org/"> 9 <DataResultGet> 10 <RData> 11 <Timestamp>2000-01-01T00:00:00Z</Timestamp> 12 <Type>r4</Type> 13 <Quality>Normal</Quality> 14 <Tag>C_TEST_FLAG1</Tag> 15 <Value> 16 <time>0001-01-01T00:00:00</time> 17 <r4>4</r4> 18 <r8>1</r8> 19 </Value> 20 </RData> 21 <RData> 22 <Timestamp>2023-01-01T00:00:00</Timestamp> 23 <Type>r4</Type> 24 <Quality>Normal</Quality> 25 <Tag>C_TEST_FLAG2</Tag> 26 <Value> 27 <time>2023-01-01T00:00:00</time> 28 <r4>41313123</r4> 29 <r8>11233</r8> 30 </Value> 31 </RData> 32 </DataResultGet> 33 </DataListResponse> 34 </soap:Body> 35 </soap:Envelope>
2、数据组装
1 public static string SendDataFun() 2 { 3 XmlDocument xmlResponsetDataDoc = new XmlDocument(); 4 // 创建头部声明信息 <?xml version="1.0" encoding="utf-8"?> 5 XmlDeclaration xmlDoc = xmlResponsetDataDoc.CreateXmlDeclaration("1.0", "utf-8", null); 6 xmlResponsetDataDoc.AppendChild(xmlDoc); 7 8 //新建根节点 9 XmlElement soapRootItem = xmlResponsetDataDoc.CreateElement("Envelope");//soap:Envelope 10 soapRootItem.SetAttribute("xmlns:xsi", "http://ww.w3.org/2001/XMLSchema-instance"); 11 soapRootItem.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); 12 soapRootItem.SetAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/"); 13 xmlResponsetDataDoc.AppendChild(soapRootItem); 14 //新建body节点 15 XmlElement soapBodyRootItem = xmlResponsetDataDoc.CreateElement("Body");//soap:Body 16 soapRootItem.AppendChild(soapBodyRootItem); 17 18 //新建DataListResponse 节点 19 XmlElement soapDataListResponse = xmlResponsetDataDoc.CreateElement("DataListResponse"); 20 soapDataListResponse.SetAttribute("xmlns", "http://tempuri.org/"); 21 soapBodyRootItem.AppendChild(soapDataListResponse); 22 //新建DataResultGet节点 23 XmlElement soapDataListResult = xmlResponsetDataDoc.CreateElement("DataResultGet"); 24 soapDataListResponse.AppendChild(soapDataListResult); 25 //新建RData节点 26 XmlElement soapRData = xmlResponsetDataDoc.CreateElement("RData"); 27 soapDataListResult.AppendChild(soapRData); 28 //新建RData节点下数据 29 XmlElement soapTimestamp = xmlResponsetDataDoc.CreateElement("Timestamp"); 30 soapTimestamp.InnerText = "2000-01-01T00:00:00Z"; 31 soapRData.AppendChild(soapTimestamp); 32 XmlElement soapType = xmlResponsetDataDoc.CreateElement("Type"); 33 soapType.InnerText = "r4"; 34 soapRData.AppendChild(soapType); 35 XmlElement soapQuality = xmlResponsetDataDoc.CreateElement("Quality"); 36 soapQuality.InnerText = "Bad"; 37 soapRData.AppendChild(soapQuality); 38 XmlElement soapTag = xmlResponsetDataDoc.CreateElement("Tag"); 39 soapTag.InnerText = "C_TEST_FLAG1"; 40 soapRData.AppendChild(soapTag); 41 //新建RData下value节点 42 XmlElement soapValue = xmlResponsetDataDoc.CreateElement("Value"); 43 soapRData.AppendChild(soapValue); 44 //新建value节点数据 45 XmlElement soaptime = xmlResponsetDataDoc.CreateElement("time"); 46 soaptime.InnerText = "0001-01-01T00:00:00"; 47 soapValue.AppendChild(soaptime); 48 XmlElement soapr4 = xmlResponsetDataDoc.CreateElement("r4"); 49 soapr4.InnerText = "4"; 50 soapValue.AppendChild(soapr4); 51 XmlElement soapr8 = xmlResponsetDataDoc.CreateElement("r8"); 52 soapr8.InnerText = "1"; 53 soapValue.AppendChild(soapr8); 54 55 //组装第二个RData2节点 56 XmlElement soapRData2 = xmlResponsetDataDoc.CreateElement("RData"); 57 soapDataListResult.AppendChild(soapRData2); 58 //新建RData2节点下数据 59 XmlElement soapTimestamp2 = xmlResponsetDataDoc.CreateElement("Timestamp"); 60 soapTimestamp2.InnerText = "2023-01-01T00:00:00"; 61 soapRData2.AppendChild(soapTimestamp2); 62 XmlElement soapType2 = xmlResponsetDataDoc.CreateElement("Type"); 63 soapType2.InnerText = "r4"; 64 soapRData2.AppendChild(soapType2); 65 XmlElement soapQuality2 = xmlResponsetDataDoc.CreateElement("Quality"); 66 soapQuality2.InnerText = "Bad"; 67 soapRData2.AppendChild(soapQuality2); 68 XmlElement soapTag2 = xmlResponsetDataDoc.CreateElement("Tag"); 69 soapTag2.InnerText = "C_TEST_FLAG2"; 70 soapRData2.AppendChild(soapTag2); 71 //新建RData下value节点 72 XmlElement soapValue2 = xmlResponsetDataDoc.CreateElement("Value"); 73 soapRData2.AppendChild(soapValue2); 74 //新建value节点数据 75 XmlElement soaptime2 = xmlResponsetDataDoc.CreateElement("time"); 76 soaptime2.InnerText = "2023-01-01T00:00:00"; 77 soapValue2.AppendChild(soaptime2); 78 XmlElement soapr42 = xmlResponsetDataDoc.CreateElement("r4"); 79 soapr42.InnerText = "41313123"; 80 soapValue2.AppendChild(soapr42); 81 XmlElement soapr82 = xmlResponsetDataDoc.CreateElement("r8"); 82 soapr82.InnerText = "11233"; 83 soapValue2.AppendChild(soapr82); 84 85 //xml转字符串 86 string strXmlData = xmlResponsetDataDoc.OuterXml; 87 strXmlData = strXmlData.Replace("Envelope", "soap:Envelope");//如果可以自行组装域进去此处就不用替换 88 strXmlData = strXmlData.Replace("Body", "soap:Body"); 89 90 return strXmlData; 91 }
3、数据解析
1 public static void RecvDataFun(string strRecvData) 2 { 3 //数据解析 4 XmlDocument xmlRecvtDataDoc = new XmlDocument(); 5 xmlRecvtDataDoc.LoadXml(strRecvData); 6 var nodeListData = xmlRecvtDataDoc.GetElementsByTagName("RData"); 7 //遍历输出 8 foreach (XmlElement node in nodeListData) 9 { 10 string strRDataType = node.GetElementsByTagName("Type")[0].InnerText; 11 string strRDataTag = node.GetElementsByTagName("Tag")[0].InnerText; 12 if(strRDataType != "None") 13 { 14 var nodeListValue = node.GetElementsByTagName("Value"); 15 int nNum = nodeListValue.Count; 16 foreach (XmlElement nodeValue in nodeListValue) 17 { 18 string strValue = nodeValue.GetElementsByTagName(strRDataType)[0].InnerText; 19 } 20 } 21 } 22 }