C#如何从内存中的字符串创建XmlDocument

可直接用XmlDocument.LoadXml()加载格式良好的XML字符串;需确保有根元素、标签闭合,不支持DTD/外部实体;编码声明被识别但不影响解析;字符串须为.NET string类型,不可手动编码转换;需高级功能时配合XmlReader。

可以直接用 XmlDocument.LoadXml() 方法,把字符串内容加载为 XmlDocument 对象。

使用 LoadXml 加载字符串

这是最直接的方式,适用于格式良好(well-formed)的 XML 字符串:

  • 字符串必须是合法的 XML,不能缺少根元素或标签不闭合
  • 不支持 DTD 或外部实体(默认禁止,避免 XXE 攻击)
  • 编码声明(如 )会被识别,但实际解析不依赖它——字符串本身是 UTF-16(.NET string 内部编码)

示例:

string xml = @"Hello";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

处理带 BOM 或编码不一致的字符串

如果 XML 字符串来自文件读取、网络响应等,可能含 UTF-8 BOM 或声明为其他编码(如 encoding="gb2312"),但 .NET 的 string 已是解码后的 Unicode。只要字符串内容本身结构正确,LoadXml 就能正常工作。

⚠️ 注意:不要手动用 Encoding.UTF8.GetBytes() 再转成字符串传入——这会导致乱码。原始 XML 字符串应保持为 .NET string 类型直接传入。

需要验证或自定义解析时用 XmlReader

若需校验 DTD、启用内联 Schema、控制命名空间处理,或想捕获更详细的解析错误,可配合 XmlReader

  • 创建 XmlReaderSettings,设置 DtdProcessing = DtdProcessing.Parse(慎用)、ValidationType = ValidationType.Schema
  • XmlReader.Create(new StringReader(xml), settings) 构造 reader
  • 再调用 doc.Load(reader)

示例(仅启用 DTD 解析):

var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse };
using var reader = XmlReader.Create(new StringReader(xml), settings);
doc.Load(reader);

异常处理建议

LoadXml() 遇到格式错误会抛出 XmlException,建议捕获并提示具体位置:

try
{
    doc.LoadXml(xml);
}
catch (XmlException ex)
{
    Console.WriteLine($"XML 解析失败,行 {ex.LineNumber},列 {ex.LinePosition}:{ex.Message}");
}