在.Net 2.0中,如何向XML文件写入和读取二进制数据?

4

我现在已经阅读了很多关于如何使用XMLWriter.WriteBase64方法将二进制数据写入XML的帖子(例如this),但我还没有看到过说明如何读取base64编码数据的文章。是否有其他内置方法?我也很难找到关于这个主题的可靠文档。

这是我正在使用的XML文件:

<?xml version="1.0"?>
<pstartdata>
  <pdata>some data here</pdata>
  emRyWVZMdFlRR0FFQUNoYUwzK2dRUGlBS1ZDTXdIREF ..... and much, much more.
</pstartdata>

创建该文件的C#代码(.Net 4.0):
FileStream fs = new FileStream(Path.GetTempPath() + "file.xml", FileMode.Create);

            System.Xml.XmlTextWriter w = new System.Xml.XmlTextWriter(fs, null);
            w.Formatting = System.Xml.Formatting.None;

            w.WriteStartDocument();
            w.WriteStartElement("pstartdata");
            #region Main Data
            w.WriteElementString("pdata", "some data here");

            // Write the binary data
            w.WriteBase64(fileData[1], 0, fileData[1].Length);
            #endregion (End) Main Data (End)

            w.WriteEndDocument();
            w.Flush();
            fs.Close();

现在,面对真正的挑战……

好的,正如你们所看到的,上面是用 .Net 4.0 写的。不幸的是,XML 文件需要被一个使用 .Net 2.0 的应用程序读取。读取二进制(base 64)数据已经成为了一项相当大的挑战。

用于读取 XML 数据的代码(.Net 2.0):

System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();

            xDoc.LoadXml(xml_data);

            foreach (System.Xml.XmlNode node in xDoc.SelectNodes("pstartdata"))
            {
                foreach (System.Xml.XmlNode child in node.ChildNodes)
                {
                    MessageBox.Show(child.InnerXml);
                }
            }

我需要添加什么才能读取上面展示的base64编码数据?
2个回答

4

要从XML中读取数据,可以使用XmlReader,具体来说是使用ReadContentAsBase64方法。

另一个选择是使用Convert.FromBase64String

byte[] binaryData;
try 
{
  binaryData = System.Convert.FromBase64String(base64String);
}

注意:您应该查看编写代码的方式——看起来您正在将二进制数据写入pstartdata元素(以及之前的pdata元素)。这看起来不太对——请参阅@Yahia的答案

对我来说困难的部分就是一般情况下加载数据,因为它不像其他数据那样直接作为元素字符串的一部分。你明白我的意思吗? - user725913
@Evan - 请看 Yahia 的答案。你正在将所有数据都写入到“pstartdata”元素中。重新考虑如何编写数据,使其仅进入一个元素,以便更轻松地读取它们。 - Oded
+1,因为Convert.FromBase64String方法可以一次性检索未知长度的数据,而不像ReadContentAsBase64方法那样需要多次调用。 - O. R. Mapper

1
你似乎写了一些错误的 XML - 使用以下内容来编写数据:
        w.WriteStartDocument();
        w.WriteStartElement("pstartdata");
        #region Main Data
        w.WriteElementString("pdata", "some data here");

        // Write the binary data
        w.WriteStartElement("bindata");
        w.WriteBase64(fileData[1], 0, fileData[1].Length);
        w.WriteEndElement();
        #endregion (End) Main Data (End)

        w.WriteEndDocument();
        w.Flush();
        fs.Close();

如果要读取,您将需要使用XmlReader.ReadContentAsBase64

由于您要求其他方法来编写和读取二进制数据 - 还有XmlTextWriter.WriteBinHexXmlReader.ReadContentAsBinHex。请注意,这些方法生成的数据比它们的Base64对应项更长...


关于使用 XmlReader.ReadContentAsBase64 的随意声明迅速隐藏了除非您知道数据长度,否则使用该方法并不是非常直接的事情。考虑到这一点,似乎 Oded 的回答更好地描述了如何解决问题。 - O. R. Mapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接