C# xml文件中的Unescape字符
不幸的是,我无法访问带有unescape char的xml文件的源代码,而unescape char无法通过LoadXml方法进行解析。我编写了几行代码来替换xml值中的特殊char以转义char。但是,我觉得没那么好。请帮我改进一下C# xml文件中的Unescape字符,c#,xml,regex,C#,Xml,Regex,不幸的是,我无法访问带有unescape char的xml文件的源代码,而unescape char无法通过LoadXml方法进行解析。我编写了几行代码来替换xml值中的特殊char以转义char。但是,我觉得没那么好。请帮我改进一下 private bool XmlEscaper(string inputXml, out string escapableXml) { bool isSuccess = true; escapableXml = string
private bool XmlEscaper(string inputXml, out string escapableXml)
{
bool isSuccess = true;
escapableXml = string.Empty;
StringBuilder xmlReconstruct = new StringBuilder();
try
{
string firstFilter = Regex.Replace(inputXml, @"([\n\t\r\f\v])", string.Empty, RegexOptions.Multiline);
string[] secondFilter = firstFilter.Split(new String[] { @">" }, StringSplitOptions.None);
///***
///final filtration: separate every
///node and value independently,
///transform unescape characters and
///reconstruct the xml
///***
for (int i = 0; i < secondFilter.Length - 1; i++)
{
secondFilter[i] = String.Concat(secondFilter[i], ">");
if (!secondFilter[i].StartsWith("<") && !secondFilter[i + 1].StartsWith("</") && !Regex.IsMatch(secondFilter[i], @"(<)(/)"))
{
string temp = secondFilter[i + 1];
string[] cap = temp.Split(new String[] { @"</" }, StringSplitOptions.None);
secondFilter[i] = String.Concat(secondFilter[i], cap[0]);
secondFilter[i + 1] = String.Concat("</", cap[1]);
}
if (Regex.IsMatch(secondFilter[i], @"(<)(/)") && !secondFilter[i].StartsWith("</"))
{
string[] split = secondFilter[i].Split(new String[] { @"</" }, StringSplitOptions.None);
split[0] = System.Security.SecurityElement.Escape(split[0]);
xmlReconstruct.Append(split[0]);
xmlReconstruct.Append(String.Concat("</", split[1]));
}
else
{
xmlReconstruct.Append(secondFilter[i]);
}
}
escapableXml = xmlReconstruct.ToString();
}
catch (Exception ex)
{
isSuccess = false;
}
return isSuccess;
}
private bool XmlEscaper(字符串输入XML,字符串输出escapableXml)
{
bool issucess=true;
escapableXml=string.Empty;
StringBuilder xmlReconstruct=新建StringBuilder();
尝试
{
string firstFilter=Regex.Replace(inputXml,@“([\n\t\r\f\v])”,string.Empty,RegexOptions.Multiline);
string[]secondFilter=firstFilter.Split(新字符串[]{@“>”},StringSplitOptions.None);
///***
///最终过滤:每分钟分离一次
///节点和值独立,
///转换unescape角色和
///重构xml
///***
for(int i=0;i”);
如果(!secondFilter[i].StartsWith(“您可以通过避免一些堆内存分配来加快速度,并且不使用Regex
进行简单搜索。例如:
- 设置
xmlReconstruct
的初始容量,因为StringBuilder
对象默认为16,并根据需要加倍:StringBuilder xmlReconstruct=new StringBuilder(inputXml.Length);
- 使用
Regex.Matches
而不是String.Split
,然后处理每个返回的Match
对象
- 使用
String.Contains
而不是Regex.IsMatch
- 如果可能,只使用
xmlReconstruct.Append
;避免使用String.Concat
- 如果您正在处理多个文件,请在调用
XmlEscaper
之前初始化任何Regex
对象
如果您知道正则表达式与未转义的位置相匹配,则可以使用CDATA
将xml重写为有效的格式。您认为自己的格式“不太好”的原因是什么"?只是性能问题?你得到的越具体,答案就越具体。@C.Evenhuis是的,性能问题。我需要在平均情况下大大加快改进速度。平均情况就像it/软件行业中使用的xml文件的平均长度。因为它检查每个值,所以性能会随着f行和值在xml中显示。