2013-07-24 95 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