Igo*_*tov 101
作为删除无效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;
}
}
Run Code Online (Sandbox Code Playgroud)
作为逃避无效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;
}
}
Run Code Online (Sandbox Code Playgroud)
更新: 应该提到的是,编码操作产生的字符串的长度大于或等于源字符串的长度.将编码字符串存储在具有长度限制的字符串列中的数据库中并在应用程序中验证源字符串长度以适应数据列限制时,这可能很重要.
BLU*_*IXY 61
using System;
using System.Security;
class Sample {
static void Main() {
string text = "Escape characters ? < > & \" \'";
string xmlText = SecurityElement.Escape(text);
//output:
//Escape characters ? < > & " '
Console.WriteLine(xmlText);
}
}
Run Code Online (Sandbox Code Playgroud)
Pie*_*ant 19
如果您正在编写xml,只需使用框架提供的类来创建xml.你不必为逃避或任何事情而烦恼.
Console.Write(new XElement("Data", "< > &"));
Run Code Online (Sandbox Code Playgroud)
会输出
<Data>< > &</Data>
Run Code Online (Sandbox Code Playgroud)
如果需要读取格式错误的XML文件,请不要 使用正则表达式.相反,使用Html Agility Pack.
这是上述方法 RemoveInvalidXmlChars 的优化版本,它不会在每次调用时创建新数组,从而不必要地强调 GC:
public static string RemoveInvalidXmlChars(string text)
{
if (text == null)
return text;
if (text.Length == 0)
return text;
// a bit complicated, but avoids memory usage if not necessary
StringBuilder result = null;
for (int i = 0; i < text.Length; i++)
{
var ch = text[i];
if (XmlConvert.IsXmlChar(ch))
{
result?.Append(ch);
}
else if (result == null)
{
result = new StringBuilder();
result.Append(text.Substring(0, i));
}
}
if (result == null)
return text; // no invalid xml chars detected - return original text
else
return result.ToString();
}
Run Code Online (Sandbox Code Playgroud)
Irishman 提供的 RemoveInvalidXmlChars 方法不支持代理字符。要测试它,请使用以下示例:
static void Main()
{
const string content = "\v\U00010330";
string newContent = RemoveInvalidXmlChars(content);
Console.WriteLine(newContent);
}
Run Code Online (Sandbox Code Playgroud)
这将返回一个空字符串,但它不应该!它应该返回“\U00010330”,因为字符U+10330是一个有效的 XML 字符。
为了支持代理字符,我建议使用以下方法:
public static string RemoveInvalidXmlChars(string text)
{
if (string.IsNullOrEmpty(text))
return text;
int length = text.Length;
StringBuilder stringBuilder = new StringBuilder(length);
for (int i = 0; i < length; ++i)
{
if (XmlConvert.IsXmlChar(text[i]))
{
stringBuilder.Append(text[i]);
}
else if (i + 1 < length && XmlConvert.IsXmlSurrogatePair(text[i + 1], text[i]))
{
stringBuilder.Append(text[i]);
stringBuilder.Append(text[i + 1]);
++i;
}
}
return stringBuilder.ToString();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
118388 次 |
最近记录: |