我有一个包含无效XML字符的字符串.如何在解析字符串之前转义(或删除)无效的XML字符?

推荐答案

作为删除无效XML字符的方法,我建议您使用XmlConvert.IsXmlChar方法.从那以后就加了.NET框架4,并在Silverlight中展示.以下是小样本:

void Main() {
    string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    content = RemoveInvalidXmlChars(content);
    Console.WriteLine(IsValidXmlString(content)); // True
}

static string RemoveInvalidXmlChars(string text) {
    var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
    return new string(validXmlChars);
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

作为转义无效XML字符的方法,我建议您使用XmlConvert.EncodeName方法.以下是小样本:

void Main() {
    const string content = "\v\f\0";
    Console.WriteLine(IsValidXmlString(content)); // False

    string encoded = XmlConvert.EncodeName(content);
    Console.WriteLine(IsValidXmlString(encoded)); // True

    string decoded = XmlConvert.DecodeName(encoded);
    Console.WriteLine(content == decoded); // True
}

static bool IsValidXmlString(string text) {
    try {
        XmlConvert.VerifyXmlChars(text);
        return true;
    } catch {
        return false;
    }
}

Update:个 应该提到的是,编码操作产生长度大于或等于源串的长度的串.当您将编码字符串存储在数据库中具有长度限制的字符串列中,并在应用程序中验证源字符串长度以符合数据列限制时,这一点可能很重要.

.net相关问答推荐

API响应返回null错误. NET MAUI

安装特定主要版本的DotNet SDK最新版本

如何按需计算一个值并将该值缓存在FP/F#中?

如何从 tshark 的 stderr 捕获实时数据包计数?

如何将 Assembly.CodeBase 转换为 C# 中的文件系统路径?

如何确定计时器是否正在运行?

在 WebApi 中需要 SSL?

从 byte[] 创建 zip 文件

IIS Express - 500.19 无法读取配置文件 - 因为它正在查看错误的路径

将笔画应用于 WPF 中的文本块

我应该在 LINQ 查询中使用两个where子句还是&&?

在 C#/.NET 中组合路径和文件名的最佳方法是什么?

更改 SqlConnection 超时

如何将 Excel 序列日期编号转换为 .NET DateTime?

.NET 的 XPath 和 XSLT 2.0?

可以从 C# 调用 C++ 代码吗?

多个列表与 IEnumerable.Intersect() 的交集

实体框架太慢了.我有哪些 Select ?

在 try/catch/finally 中等待的一个很好的解决方案?

App.config:用户与应用程序范围