如何在C#中解析XML元素?Xamarin Studio下SOAP响应XML解析需求
在Xamarin Studio中解析SOAP返回的XML响应
嘿,我来帮你搞定在Xamarin Studio里解析SOAP返回的XML这件事!根据你给出的XML结构,我整理了两种常用的方法,你可以根据需求选择:
方法一:使用LINQ to XML(灵活快捷,无需实体类)
这种方法适合只需要提取部分元素的场景,不需要提前定义实体类,直接通过节点名称和命名空间查询即可。
首先,你需要先获取到SOAP响应的XML字符串,然后按照下面的代码处理:
// 假设你已经从SOAP请求中获取到完整的XML响应字符串 string soapXml = "你的完整XML内容"; XDocument doc = XDocument.Parse(soapXml); // 定义XML中用到的命名空间,一定要和XML里的对应! XNamespace soapNs = "http://schemas.xmlsoap.org/soap/envelope/"; XNamespace ctrmNs = "http://CTRMService/CTRM"; // 提取Header中的IsActive值 bool isActive = bool.Parse(doc.Descendants(ctrmNs + "IsActive").First().Value); Console.WriteLine($"IsActive状态: {isActive}"); // 提取Body中GetAllCompanyResult里的公司数据(假设XML里包含<Company>节点) var companies = doc.Descendants(ctrmNs + "Company") .Select(companyNode => new { 公司ID = companyNode.Element(ctrmNs + "Id")?.Value, 公司名称 = companyNode.Element(ctrmNs + "Name")?.Value }) .ToList(); // 遍历输出解析结果 foreach (var company in companies) { Console.WriteLine($"公司ID: {company.公司ID}, 名称: {company.公司名称}"); }
方法二:使用XmlSerializer(结构化映射,适合复杂场景)
如果你的XML结构比较固定,后续需要频繁使用解析后的数据,建议用这种方法,通过定义对应实体类来完成反序列化。
第一步:创建对应的实体类
根据你的XML结构,定义以下实体类(注意命名空间的匹配):
using System.Collections.Generic; using System.Xml.Serialization; [XmlRoot(Namespace = "http://schemas.xmlsoap.org/soap/envelope/")] public class SoapEnvelope { [XmlElement("Header")] public SoapHeader Header { get; set; } [XmlElement("Body")] public SoapBody Body { get; set; } } public class SoapHeader { [XmlElement(Namespace = "http://CTRMService/CTRM")] public bool IsActive { get; set; } } public class SoapBody { [XmlElement(Namespace = "http://CTRMService/CTRM")] public GetAllCompanyResponse GetAllCompanyResponse { get; set; } } public class GetAllCompanyResponse { [XmlElement(Namespace = "http://CTRMService/CTRM")] public GetAllCompanyResult GetAllCompanyResult { get; set; } } public class GetAllCompanyResult { [XmlElement("Company", Namespace = "http://CTRMService/CTRM")] public List<Company> Companies { get; set; } } public class Company { [XmlElement(Namespace = "http://CTRMService/CTRM")] public string Id { get; set; } [XmlElement(Namespace = "http://CTRMService/CTRM")] public string Name { get; set; } }
第二步:反序列化XML到实体类
然后使用XmlSerializer完成解析:
using System.IO; using System.Xml.Serialization; // 假设soapXml是你的SOAP响应字符串 XmlSerializer serializer = new XmlSerializer(typeof(SoapEnvelope)); using (StringReader reader = new StringReader(soapXml)) { SoapEnvelope envelope = (SoapEnvelope)serializer.Deserialize(reader); // 获取Header中的IsActive bool isActive = envelope.Header.IsActive; Console.WriteLine($"IsActive状态: {isActive}"); // 获取所有公司数据 var companies = envelope.Body.GetAllCompanyResponse.GetAllCompanyResult.Companies; foreach (var company in companies) { Console.WriteLine($"公司ID: {company.Id}, 名称: {company.Name}"); } }
关键注意事项
- 命名空间必须完全匹配:XML中的每个节点都有对应的命名空间,不管是用LINQ还是XmlSerializer,都要确保代码里的命名空间和XML中的一致,否则会找不到节点。
- 调整节点名称:如果你的XML中GetAllCompanyResult的实际结构和我假设的不同(比如节点名称不一样),需要修改代码里的节点名称或者实体类的属性名称。
- Xamarin兼容性:这两种方法都是.NET标准库的一部分,在Xamarin项目中可以直接使用,不需要额外安装NuGet包。
内容的提问来源于stack exchange,提问作者K. Ajay
相关产品推荐
相关产品推荐

