Записывать и читать двоичные данные из файла XML в .Net 2.0 - PullRequest
4 голосов
/ 06 февраля 2012

Я уже подготовил много публикаций (например, this one) на SO, которые объясняют, как записывать двоичные данные в XML с помощью метода XMLWriter.WriteBase64.Тем не менее, я еще не видел тот, который объясняет, как затем читать данные 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.Чтение в двоичных данных (база 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);
                }
            }

Что бы янужно добавить для чтения в базе данных 64-х (показано выше)?

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

Для чтения данных из XML вы можете использовать XmlReader, в частности метод ReadContentAsBase64.

Другой альтернативой является использование Convert.FromBase64String:

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

Примечание: вы должны посмотреть на код, который вы используете для записи - похоже, вы записываете двоичные данные в элемент pstartdata (а также pdataэлемент заранее).Выглядит не совсем правильно - см. ответ от @ Yahia .

1 голос
/ 06 февраля 2012

Вы, кажется, пишете какой-то плохой 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.WriteBinHex и XmlReader.ReadContentAsBinHex. Помните, что они производят больше данных, чем их подвески Base64 ...

...