用C# 解析这两种字符串,形成一个可调用的通用方法<?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">ok</string> <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><UploadFileResponse xmlns="http://tempuri.org/"><UploadFileResult>ok</UploadFileResult></UploadFileResponse></soap:Body></soap:Envelope>
时间: 2025-05-27 12:27:23 浏览: 23
### C# 解析两种不同的 XML 字符串并封装为通用方法
在 C# 中可以利用 `System.Xml` 命名空间中的类来解析 XML 数据。对于给定的两个 XML 字符串,可以通过创建一个通用方法实现灵活处理。
以下是完整的解决方案:
#### 方法说明
通过定义一个泛型方法 `ParseXml<T>` 来解析任意类型的 XML 节点数据[^1]。此方法支持传入任何标准的 XML 字符串,并返回指定的对象实例或其集合。
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
public class XmlParser
{
public static T ParseXml<T>(string xmlContent, Func<XmlNode, T> mapper)
{
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.LoadXml(xmlContent); // 加载 XML 内容到文档对象模型中
}
catch (Exception ex)
{
throw new ArgumentException($"无法加载 XML 文本: {ex.Message}", nameof(xmlContent));
}
XmlNode root = xmlDoc.DocumentElement; // 获取根节点
if (root == null || string.IsNullOrWhiteSpace(root.OuterXml))
{
throw new InvalidOperationException("XML 根节点为空");
}
return mapper(root); // 使用映射函数转换节点内容为目标类型
}
}
```
#### 测试用例 1:简单字符串解析
针对第一个 XML 输入 `<string xmlns="http://tempuri.org/">ok</string>` 的场景,可以直接提取内部文本值作为结果。
```csharp
static void Main(string[] args)
{
string xmlString1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><string xmlns=\"http://tempuri.org/\">ok</string>";
var result1 = XmlParser.ParseXml<string>(xmlString1, node =>
{
return node.InnerText.Trim(); // 提取节点内的纯文本内容
});
Console.WriteLine(result1);
}
// 输出: ok
```
#### 测试用例 2:复杂结构化数据解析
假设第二个 XML 是更复杂的树形结构,则需要进一步遍历子节点并将它们映射成自定义对象列表。
```csharp
class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
string xmlString2 = @"<?xml version=""1.0"" encoding=""utf-8""?>
<items>
<item id='1'>Item One</item>
<item id='2'>Item Two</item>
</items>";
List<Item> items = XmlParser.ParseXml<List<Item>>(xmlString2, node =>
{
return node.SelectNodes("item")?.Cast<XmlNode>()
.Select(itemNode => new Item
{
Id = Convert.ToInt32(itemNode.Attributes["id"]?.Value),
Name = itemNode.InnerText.Trim()
}).ToList() ?? new List<Item>();
});
foreach (var item in items)
{
Console.WriteLine($"{item.Id}: {item.Name}");
}
/*
* 输出:
* 1: Item One
* 2: Item Two
*/
}
```
以上代码展示了如何构建一个可重用的 XML 解析器以及具体的应用案例[^2]。
---
阅读全文
相关推荐


















