将无效字符解析为XML

时间:2012-04-16 17:21:56

标签: c# xml xml-parsing clr

应用程序的想法很简单,应用程序给出了一个路径,并且应用程序将每个文件的路径写入XML,我面临的问题是文件名可能有无效字符并且使应用程序停止工作,这里是我用来将文件信息解析为XML的代码:

    // the collecting details method
    private void Get_Properties(string path)
    {
        // Load the XML File
        XmlDocument xml = new XmlDocument();
        xml.Load("Details.xml");

        foreach (string eachfile in Files)
        {
            try
            {
                FileInfo Info = new FileInfo(eachfile);

                toolStripStatusLabel1.Text = "Adding : " + Info.Name;

                // Create the Root element
                XmlElement ROOT = xml.CreateElement("File");

                if (checkBox1.Checked)
                {
                    XmlElement FileName = xml.CreateElement("FileName");
                    FileName.InnerText = Info.Name;
                    ROOT.AppendChild(FileName);
                }

                if (checkBox2.Checked)
                {
                    XmlElement FilePath = xml.CreateElement("FilePath");
                    FilePath.InnerText = Info.FullName;
                    ROOT.AppendChild(FilePath);
                }

                if (checkBox3.Checked)
                {
                    XmlElement ModificationDate = xml.CreateElement("ModificationDate");
                    string lastModification = Info.LastAccessTime.ToString();
                    ModificationDate.InnerText = lastModification;
                    ROOT.AppendChild(ModificationDate);
                }

                if (checkBox4.Checked)
                {
                    XmlElement CreationDate = xml.CreateElement("CreationDate");
                    string Creation = Info.CreationTime.ToString();
                    CreationDate.InnerText = Creation;
                    ROOT.AppendChild(CreationDate);
                }

                if (checkBox5.Checked)
                {
                    XmlElement Size = xml.CreateElement("Size");
                    Size.InnerText = Info.Length.ToString() + " Bytes";
                    ROOT.AppendChild(Size);
                }

                xml.DocumentElement.InsertAfter(ROOT, xml.DocumentElement.LastChild);

                // +1 step in progressbar
                toolStripProgressBar1.PerformStep();
                success_counter++;
                Thread.Sleep(10);
            }
            catch (Exception ee)
            {
                toolStripProgressBar1.PerformStep();

                error_counter++;
            }
        }

        toolStripStatusLabel1.Text = "Now Writing the Details File";

        xml.Save("Details.xml");

        toolStripStatusLabel1.Text = success_counter + " Items has been added and "+ error_counter +" Items has Failed , Total Files Processed ("+Files.Count+")";

        Files.Clear();
    }

以下是生成详细信息后XML的外观:

<?xml version="1.0" encoding="utf-8"?>
 <Files>
  <File>
    <FileName>binkw32.dll</FileName>
    <FilePath>D:\ALL DLLS\binkw32.dll</FilePath>
    <ModificationDate>3/31/2012 5:13:56 AM</ModificationDate>
    <CreationDate>3/31/2012 5:13:56 AM</CreationDate>
    <Size>286208 Bytes</Size>
  </File>
 <File>

我想要解析为XML而没有问题的字符示例:

BX] GC ^ O ^ _nI_C {jv_rbp&amp;1b_Hâ&amp; psolher d)做ိiniᖭ

icon_Áq偩侉₳㪏ံぞ鵃_䑋屡1]

MAnaFor줡

编辑[已解决的问题]

我所要做的就是: 1-将文件名转换为UTF8-Bytes 2-将UTF8-Bytes转换回字符串

以下是方法:

byte[] FilestoBytes = System.Text.Encoding.UTF8.GetBytes(Info.Name);
string utf8 = System.Text.Encoding.UTF8.GetString(FilestoBytes);

3 个答案:

答案 0 :(得分:3)

目前尚不清楚你的哪些角色遇到了问题。只要您使用XML API(而不是尝试直接自己编写XML), 就可以使用任何有效的文本(破坏的代理对可能会导致问题),但是除了制表符,回车符和换行符之外,有效的是Unicode代码点小于空格(U + 0020)。它们根本不是用XML来满足的。

答案 1 :(得分:2)

可能是xml格式错误。 Xml文件在没有转义的情况下不能包含某些字符。 例如,这是无效的:

<dummy>You & Me</dummy>

相反,你应该使用:

<dummy>You &amp; Me</dummy>

XML中的非法字符是&amp;,&lt;和&gt; (以及“或'在属性中)

答案 2 :(得分:1)

XML中的非法字符是&amp;,&lt;和&gt; (以及“或'在属性中)

在Windows上的文件系统中,您只能拥有&amp;并且'文件名中不允许使用文件名(&lt;,&gt;,“)

保存XML时,您可以转义这些字符。例如&amp;您需要&amp;