Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.51/55: Рейтинг темы: голосов - 55, средняя оценка - 4.51
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
1

Запись массива в XML

02.06.2016, 19:41. Показов 10676. Ответов 22
Метки нет (Все метки)

Здравствуйте! Подскажите пожалуйста, как можно записать двумерный массив в XML файле, чтобы его можно было затем прочесть в DataGridView. Прямой вывод массива в DataGridView мне не подходит. Нужно именно сначала создать файл XML.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2016, 19:41
Ответы с готовыми решениями:

Запись и считывание массива структур (документ XML)
Есть задание: Ресторан содержит список блюд. Создайте массив структур «Блюда», структура содержит...

Запись в XML
Здравствуйте! Данный код записывает данные в следующем формате public void Export() { ...

Запись в xml
Работаю с библиотекой NHibernate. Необходимо сохранить в БД расположение контролов на форме, чтобы...

Запись в XML
Как выполнить добавить запись в данный файл? <?xml version="1.0" encoding="utf-8" ?>...

22
1469 / 1185 / 820
Регистрация: 29.02.2016
Сообщений: 3,579
02.06.2016, 19:58 2
xmlserializer не поддерживает двумерные массивы, можно, наверное, превратить его в одномерный и уже после записать
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
02.06.2016, 20:20  [ТС] 3
afront, ну мне нужно, чтобы структура у итогового XML файла была полноценной таблицей, а не одной строкой... может как-то без xmlserializer можно?
0
1469 / 1185 / 820
Регистрация: 29.02.2016
Сообщений: 3,579
02.06.2016, 20:39 4
без xmlserializer оч неудобно, проще сделать одномерный массив в шапке которого записать число строк и столбцов

Добавлено через 8 минут
да и зачем вам XML, может записать ваши файлы в базу данных?
0
Хитрая блондиночка $)
1464 / 979 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
02.06.2016, 20:40 5
Цитата Сообщение от Аруми Посмотреть сообщение
может как-то без xmlserializer можно?
XML это обычный текстовый файл. В двойном цикле пройдись и повтыкай в файл данные.
С коленки:
C#
1
2
3
4
5
6
7
8
9
string s;
for(int i=0;i<a.GetLength(0);i++){
 s+="<Row n="+i.ToString()+">\n";
 for(int j=0;j<a.GetLength(1);j++){
  s+="\t<Cell n="+j.ToString()+">"+a[i][j].ToString()+"</Cell>\n";
 }
 s+="</Row>\n";
}
File.WriteAllText("Файл",s);
0
1469 / 1185 / 820
Регистрация: 29.02.2016
Сообщений: 3,579
02.06.2016, 21:45 6
XML Serialization of Generic Dictionary, Multidimensional Array, and Inherited Type, with sharpSerializer .NET
http://www.codeproject.com/Art... Multidimen
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
02.06.2016, 21:55 7
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int[][] values = new int[][]
    {
        new int[] { 1, 2 },
        new int[] { 3, 4 },
        new int[] { 5, 6 },
    };
 
XDocument doc = new XDocument(
    new XDeclaration("1.0", "UTF-8", null),
    new XElement("root",
        values.Select(row => new XElement("row",
            row.Select(cell => new XElement("cell", cell))))));
 
using (var streamWriter = new StreamWriter("file.xml", false, Encoding.UTF8))
{
    XmlWriterSettings settings = new XmlWriterSettings()
    {
        Indent = true,
        IndentChars = " ",
        Encoding = Encoding.UTF8,
        NewLineChars = Environment.NewLine
    };
 
    using (XmlWriter xmlWriter = XmlDictionaryWriter.Create(streamWriter, settings))
    {
        doc.Save(xmlWriter);
        xmlWriter.Flush();
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<root>
 <row>
  <cell>1</cell>
  <cell>2</cell>
 </row>
 <row>
  <cell>3</cell>
  <cell>4</cell>
 </row>
 <row>
  <cell>5</cell>
  <cell>6</cell>
 </row>
</root>
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
02.06.2016, 22:38  [ТС] 8
Rius, а что такое XmlDictionaryWriter? Подключила, вроде бы, всё, что нужно, а на неё всё равно пишет "не существует в текущем контексте".
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
03.06.2016, 05:04 9
#region Сборка System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Run time.Serialization.dll
#endregion
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
03.06.2016, 05:04 10
#region Сборка System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Run time.Serialization.dll
#endregion
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
03.06.2016, 11:04  [ТС] 11
Rius, подключила, спасибо. А как перевести двумерный массив в зубчатый?

Добавлено через 8 минут
ох... что-то туплю) уже сделала
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
03.06.2016, 11:06 12
Можно без преобразования, для двумерного сразу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
int[,] values2 = new int[,]
{
    { 1, 2 },
    { 3, 4 },
    { 5, 6 },
};
 
doc = new XDocument(
    new XDeclaration("1.0", "UTF-8", null),
    new XElement("root",
        Enumerable.Range(0, values2.GetLength(0)).Select(row => new XElement("row",
            Enumerable.Range(0, values2.GetLength(1)).Select(column => new XElement("cell",
                values2[row, column]))))));
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
03.06.2016, 11:11  [ТС] 13
Rius, ааа) так лучше) большое спасибо)
а как потом этот файл ещё можно прочесть в DataGridView?
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
03.06.2016, 11:13 14
Считать обратно в массив, заполнить DataTable и подключить его к DataGridView.
Вместо DataTable можно сделать свой класс для строк и засунуть их в коллекцию, которая может служить источником для DataGridView.
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
03.06.2016, 11:17  [ТС] 15
Rius, мммм... хорошо, спасибо
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
03.06.2016, 11:37 16
Вот так примерно из XDocument в 2-мерный массив, но наверняка можно как-то красивее.
C#
1
2
3
4
5
6
7
8
9
10
11
int rows = doc.Descendants("row").Count();
int columns = doc.Descendants("row").Select(row => row.Descendants("cell").Count()).Max();
int[,] values3 = new int[rows, columns];
 
doc.Descendants("row").Select((x, i) => new { RowX = x, RowIndex = i}).ToList().ForEach(rowItem =>
{
    rowItem.RowX.Descendants("cell").Select((x, i) => new { CellX = x, CellIndex = i }).ToList().ForEach(cellItem =>
        {
            values3[rowItem.RowIndex, cellItem.CellIndex] = (int)cellItem.CellX;
        });
});
Можно просто через цикл for и получение нод по индексам.
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
03.06.2016, 11:55  [ТС] 17
Rius, так ругается на строчку
C#
1
values3[rowItem.RowIndex, cellItem.CellIndex] = (int)cellItem.CellX;
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
03.06.2016, 12:01 18
Как ругается-то? Текст ошибки?
0
2 / 2 / 1
Регистрация: 29.05.2012
Сообщений: 107
03.06.2016, 12:09  [ТС] 19
Rius,
Необработанное исключение типа "System.FormatException" в mscorlib.dll
Дополнительные сведения: Входная строка имела неверный формат.
0
Эксперт .NET
7705 / 5169 / 1233
Регистрация: 25.05.2015
Сообщений: 15,729
Записей в блоге: 14
03.06.2016, 12:10 20
Содержимое doc приведите. В отладчике там видно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2016, 12:10

Запись в XML
Здравствуйте! У меня такая проблемка: XmlWriterSettings settings = new XmlWriterSettings(); ...

Запись в Xml
Доброго времени. У меня в методе записи в Xml вылетает ошибка: Невозможно получить доступ к файлу,...

Запись в XML
Тема уже может и заезженная, но выручайте. Нужно записать в файл номер уровня и текст. Для того...

Запись в xml файл
Добрый день. Возник вопрос. using (XmlWriter wr = XmlWriter.Create(&quot;test2.xml&quot;)) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.