You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:19:37