Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Трансформация XML


Автор: m9yt 17.5.2013, 11:56
Добрый день.
У меня есть XML - файл с некоторыми данными из программы. Так же есть 2 xslt файла, которые, как я понял, определяют, в каком формате этот XML будет отображаться. В первом xslt - описание самой таблицы, во втором - строк, находящихся в таблице.
Вопрос в том, можно ли каким - то образом все это поместить в dataGridView посредством dataSet или еще чего - либо?
Просто не силен в XML и вообще не уверен, правильно ли я объяснил имеющуюся проблему.

Автор: diadiavova 17.5.2013, 12:11
Датасет, равно как и дататэйбл умеют сохранять данные в хмл, а так же загружать их из хмл. Этим можно воспользоваться, только придется написать преобразование, которое твой хмл приведет в вид, понятный датесету или дататейблу. Формат там довольно простой, просто заполни табличку данными и вызови метод WriteXml, посмотри полученный документ, там все понятно. Дальше напиши xslt, который приведет хмл-данные в нужный вид. Это если надо иметь возможность настроить отображение. А так вообще поколдуй вот с этим
http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=RU-RU&k=k%28System.Xml.XmlDataDocument%29;k%28vs.objectbrowser%29;k%28TargetFrameworkMoniker-.NETFramework

Автор: m9yt 17.5.2013, 12:19
Так у меня же уже есть готовые xslt - файлы...

Просто суть в том, что в этом XML находятся данные разных частей программы, и эти xslt, как я понял, вычленяют нужную мне в конкретном случае информацию для отображения в dataGridView.

Автор: diadiavova 17.5.2013, 12:27
Цитата(m9yt @  17.5.2013,  13:19 Найти цитируемый пост)
Так у меня же уже есть готовые xslt - файлы...

Если они делают именно то, о чем я написал, то просто у датасета вызови ReadXml, передай ему адрес результата преобразования и все должно загрузиться. Если эти файлы делают что-то другое, то узнай что именно smile 
Цитата(m9yt @  17.5.2013,  13:19 Найти цитируемый пост)
Просто суть в том, что в этом XML находятся данные разных частей программы, и эти xslt, как я понял, вычленяют нужную мне в конкретном случае информацию для отображения в dataGridView.

Возможно не вычленяют, а именно приводят к виду, понятному датасету. Попробуй загрузить.

Автор: m9yt 17.5.2013, 12:36
Цитата(diadiavova @ 17.5.2013,  12:27)
передай ему адрес результата преобразования и все должно загрузиться

Вот я и не пойму, как это преобразование вообще делается, используя XSLT - файлы.

Автор: diadiavova 17.5.2013, 12:38
Цитата(m9yt @  17.5.2013,  13:36 Найти цитируемый пост)
Вот я и не пойму, как это преобразование вообще делается, используя XSLT - файлы. 

Тебе надо его выполнить программно или можно с помощью студии?

Добавлено через 1 минуту и 46 секунд
Программно это  делается с помощью вот этого класса
http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=RU-RU&k=k%28System.Xml.Xsl.XslCompiledTransform%29;k%28vs.objectbrowser%29;k%28TargetFrameworkMoniker-.NETFramework

Автор: m9yt 17.5.2013, 13:22
Пробую сделать так:

Код

 XslCompiledTransform xslt = new XslCompiledTransform();

xslt.Load("DescriptionTable.xslt"); 
xslt.Transform("1.xml", "2.xml"); // Появляется новый набор данных

xslt.Load("DescriptionRow.xslt");
xslt.Transform("1.xml", "3.xml"); // Появляется новый набор данных

dataSet1.ReadXml("2.xml"); // Пробую загрузить данные

dataGridView1.DataSource = dataSet1;
dataGridView1.DataMember = "Table1"; //В отладчике почему - то вижу у датасет1 таблицу Table1. Не знаю, почему такое название. Да
                                                                            // и в datGridView ничего не отображается

Автор: diadiavova 17.5.2013, 13:37
Цитата(m9yt @  17.5.2013,  14:22 Найти цитируемый пост)
и в datGridView ничего не отображается

Учитывая, что я не вижу результата преобразования, сказать что-то по этому поводу я вряд ли могу. Хотел выполнить преобразование, но поскольку хмл-файл неполный, ессно этого не сделаешь. Структура файла должна быть примерно такой: корневой элемент имеет имя датасета(вроде бы); в него вложены элементы, имеющие такое же имя, как у таблицы и каждый предствляет отдельную строку таблицы; ну и в элементах-строках размещаются элементы, имена которых совпадают с именами столбцов, это ячейки и их содержимое - значение каждой ячейки. Если структура файла другая - может ничего не получиться. Хотя можно попробовать поработать с классом, на который я дал ссылку в первом посте. Я помню со старым гридом(из первого фреймворка) он прекрасно работал и даже отображал документ в виде сворачивающихся блоков строк, с гридвюьем я этот класс не пользовал, так что не знаю что будет.

Автор: m9yt 17.5.2013, 13:50
В общем, после преобразования одним из файлов получил следующие xml-ки:

По таблицам:
Код




По строкам в таблицах:
Код




Теперь нужно организовать группировку строк в соответствующие таблицы, используя ID.
Каким образом можно наиболее просто решить данную задачу?

Автор: diadiavova 17.5.2013, 14:08
Цитата(m9yt @  17.5.2013,  14:50 Найти цитируемый пост)
Каким образом можно наиболее просто решить данную задачу? 

Наиболее просто было сразу выполнить преобразование таким образом, чтобы получить готовый результат. Можно, конечно, преобразовать и результат предыдущего преобразования, только смысла в этом нет.
Цитата(m9yt @  17.5.2013,  14:50 Найти цитируемый пост)
Теперь нужно организовать группировку строк в соответствующие таблицы, используя ID таблицы из 1 файла.

Группировку в xslt можно сделать как описано здесь
http://erum.ru/19.htm

Автор: m9yt 17.5.2013, 14:17
А можно как - то без XSLT обойтись? Например, сохранить где - то все id таблиц, а потом в цикле каждый id сравнивать с id, указанным в описании строки, и  тем самым формировать структуру dataGridView?

Автор: diadiavova 17.5.2013, 14:38
Цитата(m9yt @  17.5.2013,  15:17 Найти цитируемый пост)
А можно как - то без XSLT обойтись? 

Да без проблем. Просто этот язык как раз для таких задач предназначен и очень удобен для преобразования хмл.
Цитата(m9yt @  17.5.2013,  15:17 Найти цитируемый пост)
Например, сохранить где - то все id таблиц, а потом в цикле каждый id сравнивать с id, указанным в описании строки, и  тем самым формировать структуру dataGridView? 

В принципе есть возможность реализовать часть программной логики на шарпе и использовать ее в хслт. Но если тебе это не подходит, то можно и полностью на шарпе. Если использовать последний вариант, то какие с этим проблемы? Что не понятно?
Вообще, у использования хслт в таких задачах есть еще одно важное преимущество: документ хслт можно менять, не затрагиваю программный код, а значит не только во время разработки, так что я бы рассмотрел этот вариант внимательнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)