C# xml文件中的Unescape字符

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

不幸的是,我无法访问带有unescape char的xml文件的源代码,而unescape char无法通过LoadXml方法进行解析。我编写了几行代码来替换xml值中的特殊char以转义char。但是,我觉得没那么好。请帮我改进一下

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中显示。