Генерировать двоичное содержимое XML-файла

#c#

#c#

Вопрос:

У меня есть столбец с именем contents в таблице с именем File в SQL Server 2008. Тип данных content столбца — varbinary(MAX) . У меня есть XML-файл, и мне нужно сгенерировать его содержимое в двоичном формате, используя c#.net 3.5.

Имя файла — Test.XML и мне нужно сгенерировать его содержимое в файле с именем Test.txt . Затем я могу написать скрипт обновления, чтобы установить его содержимое.

Комментарии:

1. Что вы подразумеваете под «генерировать его содержимое в двоичном формате»??? Что вы пытаетесь здесь сделать?? Совсем непонятно ….. для хранения XML-файла используйте XML тип данных — не varbinary…. И называется ли ваш столбец content or contents

2. Ну, предположим, у нас есть XML, я прочитал все содержимое в текстовом виде, используя File. Метод ReadAllText. Затем я хочу записать содержимое в другой файл, используя BinaryWriter. Надеюсь, я достаточно ясно выразился. Извините, что в прошлый раз не совсем ясно выразился.

3. Да, я тоже немного заблудился здесь. Вам нужно сохранить XML-файл в поле «содержимое» в базе данных?

4. Почему вы настаиваете на преобразовании этого XML в двоичный файл??? Вообще не имеет никакого смысла….. XML — это просто строка — просто сохраните ее в столбце типа XML и покончите с этим….

5. Я согласен, что это не имеет смысла, когда у нас есть столбец типа XML. Но то, что я описал, — это то, что мне нужно выполнить. Если вы, ребята, можете высказать свои предложения, мы будем очень признательны!

Ответ №1:

Откройте файл, преобразуйте в массив байтов, затем просто вставьте массив байтов в поле varbinary в вашей базе данных:

 string xml = File.ReadAllText("text.xml");
byte[] bytes = Encoding.ASCII.GetBytes(xml);

// put bytes into db
  

Обновить:

Если вы действительно хотите, чтобы это было строковое представление из 0 и 1 — как мне кажется, бессмысленно, вам просто нужно выполнить итерацию по массиву байтов и преобразовать каждый байт в двоичный файл с основанием 2 и добавить указанное значение в объект string builder, подобный этому:

 string xml = File.ReadAllText("text.xml");
byte[] bytes = Encoding.ASCII.GetBytes(xml);
StringBuilder sb = new StringBuilder();

foreach (byte b in bytes)
{
    sb.Append(Convert.ToString(b, 2));
}

File.WriteAllText("test2.txt", sb.ToString());
  

Я не хочу, чтобы кто-нибудь голосовал против меня за этот, казалось бы, глупый ответ — посмотрите на комментарии ниже, это то, что он говорит, что хочет.

Обновить:

Чтобы преобразовать массив байтов в шестнадцатеричный, выполните следующее:

 string xml = File.ReadAllText("text.xml");
byte[] bytes = Encoding.ASCII.GetBytes(xml);
StringBuilder sb = new StringBuilder();

foreach (byte b in bytes)
{
      sb.AppendFormat("{0:x2}", b);
}

File.WriteAllText("test2.txt", sb.ToString());
  

Комментарии:

1. Хорошо, но мне нужно записать эти байты в файл, скопировать и обновить sql-скрипт. Я пытался сделать это: string xmlData = File. ReadAllText(inputFilePath); byte[] байты = кодировка. ASCII. Получаем байты(xmlData); FileStream fs = новый файловый поток(outputFilePath, FileMode. Открыть или создать); BinaryWriter sw = новый BinaryWriter(fs); sw.Write (байты); sw.Close(); исходный выходной файл показывает мне то же содержимое в XML. Разве мы не должны видеть расплывчатые числа, которые не имеют никакого смысла.

2. Вот как они извлекают двоичное содержимое из строки базы данных fileContentsDecoded = UnicodeEncoding. Юникод. Получить строку (specsXML);

3. Я действительно не понимаю, зачем вам это нужно делать — зачем вам хранить xml в виде 1 и 0? Это не имеет никакого смысла. Даже XML-файл на самом деле двоичный, как и любой файл на компьютере, то, о чем вы говорите, — это не преобразование в двоичный файл, а получение строкового представления двоичного файла, где для каждого байта у нас есть репрезентативные символы ASCII 1 и 0…is это то, что вы хотите сделать? в итоге вы получите файл гораздо большего размера, чем исходный XML-файл.

4. @user424294 вы знаете, что varbinary (max) в sql не ожидает строку ‘101010’ — он просто принимает массив байтов (из . Net world) и сохраняет его. Аналогичным образом, если вам нужно преобразовать его в двоичный литерал для динамического оператора SQL, вам понадобится шестнадцатеричная кодировка 0x4E9ABC2...

5. @dormisher — обновите свой ответ, чтобы показать, как превратить двоичный массив в шестнадцатеричную строку, и вы получили от меня 1.