2013-07-24 94 views
4

在我關於存儲數據的問題之後,有人建議我可以使用XML,但是通過使用Base64編碼來對文件進行模糊處理。我喜歡這個想法,並且我已經在XML中實現了我想要的,但是我不知道如何將它保存在Base64中。這是到目前爲止我的代碼:以Base64編碼編寫XML

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 

XmlWriter write = XmlWriter.Create("C:\\Users\\Andy\\Desktop\\database.xml", settings); 
write.WriteStartDocument(); 
write.WriteStartElement("Database"); 
write.WriteStartElement("Entry"); 
write.WriteAttributeString("key", "value"); 
write.WriteEndElement(); 
write.WriteEndElement(); 

write.Flush(); 
write.Close(); 

回答

3

寫:

var sb = new StringBuilder(); 
var settings = new XmlWriterSettings(); 
//..settings 
using (var writer = XmlWriter.Create(sb, settings)) 
{ 
    //... 
} 
//http://stackoverflow.com/questions/1564718/using-stringwriter-for-xml-serialization 
var encoding = new UnicodeEncoding(); 
string s = Convert.ToBase64String(encoding.GetBytes(sb.ToString())); 

File.WriteAllText("c:\temp.txt", s); 

讀它:

string readText = File.ReadAllText("c:\temp.txt"); 
byte[] toDecodeByte = Convert.FromBase64String(readText); 

using (var stream = new MemoryStream(toDecodeByte)) 
{ 
    using (XmlReader reader = XmlReader.Create(stream)) 
    { 
     //.. read your xml 
    } 
} 
+0

謝謝你的回答。我想編碼整個XML文件,所以請你在這一部分進行擴展。 – Andy

+0

@安迪操作,完成! – giammin

+0

+1感謝您的編輯。那麼我會使用一個編寫器對象來寫's'到一個文件嗎?另外,我知道我最初沒有問這個問題,但是你能告訴我如何讀取XML文件嗎? – Andy

2

您需要將您的XmlWriter轉換爲字符串,這樣

using (var sw = new StringWriter()) { 
using (var xw = XmlWriter.Create(sw)) { 
// Build Xml with xw. 


    } 
    return sw.ToString(); 
} 

然後轉換您的字符串爲Base64。並將其寫入使用MemoryStream

下次使用的MemoryStream XML數據到文件

+0

謝謝你的回答。那麼我會不得不爲Base64編碼數據創建一個新的編寫器對象? – Andy

+2

+1。您應該添加顯示如何將返回的字符串轉換爲base64並將其寫入文件的代碼。 –

+0

@EhsanUllah是的,請你:) – Andy

1

下面是一個例子,以Base64編碼數據,並將其寫入到文件中。

using (var ms = new MemoryStream()) 
{ 
    // Memory Stream 
    using (XmlWriter writer = XmlWriter.Create(ms,settings)) 
    { 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("Database"); 
     writer.WriteStartElement("Entry"); 
     writer.WriteAttributeString("key", "value"); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 

     writer.Flush(); 
     writer.Close(); 

     // XML Data (Debug) 
     Console.WriteLine(new UTF8Encoding().GetString(ms.ToArray())); 

     // Pre encoding hex (Debug) 
     Console.WriteLine(BitConverter.ToString(ms.ToArray())); 

     string s = Convert.ToBase64String(ms.ToArray()); 
     Console.WriteLine(s); // (Debug) 

     // Post encoding 
     File.WriteAllText(@"C:\Temp\A.enc", s); 
    } 
} 

閱讀文件,您的答案回

// Read encoded file back to xml 
string enc_text = File.ReadAllText(@"C:\Temp\A.enc"); 
Console.WriteLine(enc_text); // (Debug) 

// Pre encoding hex 
byte[] mem_bytes = Convert.FromBase64String(enc_text); 
Console.WriteLine(BitConverter.ToString(mem_bytes)); // (Debug) 

// XML Data 
Console.WriteLine(new UTF8Encoding().GetString(mem_bytes)); 

// Read byte array into Reader 
using (var stream = new MemoryStream(mem_bytes)) 
{ 
    using (XmlReader reader = XmlReader.Create(stream)) 
    { 
     // Use reader as desired 
    } 
} 
+0

非常感謝您的回答。關於閱讀文件,我怎麼能在XmlReader中獲取數據,而不是僅僅打印它?哪個'Stream'對象最適合使用? – Andy

+0

@Andy - 我更新瞭如何從字節數組數據創建XmlReader。 – SwDevMan81

+0

非常感謝。我認爲這會是這樣的,但我對C#很陌生。 – Andy