一尘不染

在C#中转义无效的XML字符

c#

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


阅读 450

收藏
2020-05-19

共1个答案

一尘不染

作为删除无效XML字符的方法,建议您使用XmlConvert.IsXmlChar方法。它是从.NET
Framework 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;
    }
}

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

2020-05-19