在C#开发场景中,调用Web Service接口后获取到的返回数据常常采用XML格式,开发者需要从中提取所需的业务字段来完成后续逻辑处理。XML作为一种结构化的数据格式,有明确的节点层级和属性定义,C#提供了多种成熟的类库来支持其解析操作。

Web Service返回XML示例
假设我们调用的Web Service返回如下格式的XML数据,后续将基于该示例演示解析过程:
<?xml version="1.0" encoding="utf-8"?>
<UserInfoResponse>
<Status>200</Status>
<Message>查询成功</Message>
<UserList>
<User>
<UserId>1001</UserId>
<UserName>张三</UserName>
<Age>25</Age>
</User>
<User>
<UserId>1002</UserId>
<UserName>李四</UserName>
<Age>28</Age>
</User>
</UserList>
</UserInfoResponse>
使用XmlDocument解析XML
XmlDocument是.NET Framework中传统的XML文档操作类,基于DOM模型实现,适合处理结构相对简单的XML数据。
实现步骤
- 加载XML字符串到XmlDocument实例
- 通过SelectSingleNode方法获取单个节点
- 通过SelectNodes方法获取节点集合
- 读取节点的InnerText属性获取节点内容
代码示例
using System;
using System.Xml;
public class XmlDocumentParser
{
public static void ParseXml(string xmlContent)
{
// 创建XmlDocument实例
XmlDocument xmlDoc = new XmlDocument();
// 加载XML字符串
xmlDoc.LoadXml(xmlContent);
// 获取根节点
XmlNode rootNode = xmlDoc.DocumentElement;
// 获取状态节点内容
XmlNode statusNode = rootNode.SelectSingleNode("Status");
string status = statusNode.InnerText;
Console.WriteLine($"返回状态:{status}");
// 获取消息节点内容
XmlNode messageNode = rootNode.SelectSingleNode("Message");
string message = messageNode.InnerText;
Console.WriteLine($"返回消息:{message}");
// 获取用户列表节点集合
XmlNodeList userNodes = rootNode.SelectNodes("UserList/User");
Console.WriteLine("用户列表:");
foreach (XmlNode userNode in userNodes)
{
string userId = userNode.SelectSingleNode("UserId").InnerText;
string userName = userNode.SelectSingleNode("UserName").InnerText;
string age = userNode.SelectSingleNode("Age").InnerText;
Console.WriteLine($"用户ID:{userId},姓名:{userName},年龄:{age}");
}
}
}
使用LINQ to XML解析XML
LINQ to XML是.NET中更现代的XML处理方案,语法更简洁,支持LINQ查询语法,适合处理结构复杂或者需要灵活筛选的XML数据。
实现步骤
- 使用XDocument.Parse方法加载XML字符串
- 通过Element方法获取单个子元素
- 通过Elements方法获取子元素集合
- 结合LINQ查询语法筛选和提取数据
代码示例
using System;
using System.Linq;
using System.Xml.Linq;
public class LinqToXmlParser
{
public static void ParseXml(string xmlContent)
{
// 加载XML字符串到XDocument实例
XDocument xDoc = XDocument.Parse(xmlContent);
// 获取根元素
XElement rootElement = xDoc.Root;
// 获取状态元素内容
string status = rootElement.Element("Status").Value;
Console.WriteLine($"返回状态:{status}");
// 获取消息元素内容
string message = rootElement.Element("Message").Value;
Console.WriteLine($"返回消息:{message}");
// 使用LINQ查询获取用户列表
var userList = from user in rootElement.Element("UserList").Elements("User")
select new
{
UserId = user.Element("UserId").Value,
UserName = user.Element("UserName").Value,
Age = user.Element("Age").Value
};
Console.WriteLine("用户列表:");
foreach (var user in userList)
{
Console.WriteLine($"用户ID:{user.UserId},姓名:{user.UserName},年龄:{user.Age}");
}
}
}
两种方法的对比与选择
| 对比维度 | XmlDocument | LINQ to XML |
|---|---|---|
| 语法复杂度 | 较高,需要较多节点选择代码 | 较低,支持简洁的LINQ语法 |
| 灵活性 | 一般,适合固定结构解析 | 较高,支持灵活的查询和筛选 |
| 适用场景 | 旧项目维护、简单结构XML解析 | 新项目开发、复杂结构XML解析 |
注意事项
- 解析前需要确认XML字符串格式正确,避免加载失败
- 获取节点时如果节点不存在,XmlDocument的SelectSingleNode会返回null,需要做空值判断避免异常
- LINQ to XML的Element方法如果找不到对应元素会返回null,同样需要做空值处理
- 如果XML包含命名空间,需要在解析时指定对应的命名空间,否则无法正确匹配节点
C#xml解析Web_ServiceXmlDocumentLINQ_to_XML修改时间:2026-07-17 20:48:32