2012-04-16 91 views
1

應用的想法很簡單,應用程序給出的路徑,應用程序寫入每個file`s路徑轉換成XML,我面臨的問題是文件名可以有無效字符,並且使應用程序停止工作,這是我用它來解析文件信息轉換成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 & 1b_H AO & psolher d)做ိiniᖭ

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

MAnaFor줡

EDIT [問題解決]

我不得不做的是: 1轉換的文件名UTF8字節 2-轉換的UTF8字節回串

這裏是方法:

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

回答

2

也許XML的格式不正確。 Xml文件不能有一些字符沒有被轉義。 例如,這是無效的:

<dummy>You & Me</dummy> 

相反,你應該使用:

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

在XML非法字符&,<和>(以及「'或屬性)

3

目前尚不清楚,你的人物你有問題。只要您使用XML API(而不是試圖直接寫自己的XML出來),你應該罰款與任何有效的文本(破代理對可能會導致一個問題),但是什麼不會是有效的除了製表符,回車符和換行符之外,Unicode代碼點的數量少於空格(U + 0020)。他們根本不用於XML。

1

XML中的非法字符是&,<和>(以及屬性中的「或」)

在Windows上的文件系統中,只能使用&和'在文件名中(<,>,「不允許使用文件名)

保存XML時,您可以轉義這些字符。例如,對於&您將需要&amp;