Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XML и DataSet отображение различных таблиц для различных родителей / 15 сообщений из 15, страница 1 из 1
30.04.2015, 19:40
    #38950049
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
У меня есть файл XML следующего вида
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<Doc version="2">
<start> 
<table>
     <col1>1</col1>
     <col2>2</col2>
</table>
</start>
 <end> 
<table>
     <col3>3</col3>
     <col4>4</col4>
</table>
</end>
</Doc >



Мне необходимо написать интерфейс для его просмотра и редактирования

использую для отображения данных следующий код
Код: c#
1.
2.
3.
4.
DataSet ds = new DataSet();
            ds.ReadXml("test.xml");
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "table";



но таблица отображается в виде показано на картинке
col1col2col3col41234
а мне необходимо получить не 1, а 2 таблицы.
col1col212
col3col434
1 для тегов start, 2 для тегов end.
чтобы потом можно было их редактировать и в дальнейшем сохранить из dataset в XML.
Как разделить на 2 таблицы?
...
Рейтинг: 0 / 0
30.04.2015, 21:51
    #38950085
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
lex452,

если есть возможность, изменить формат файла:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<Doc version="2">
  <startTable>
    <col1>1</col1>
    <col2>2</col2>
  </startTable>
  <endTable>
    <col3>3</col3>
    <col4>4</col4>
  </endTable>
</Doc>
...
Рейтинг: 0 / 0
30.04.2015, 22:21
    #38950104
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
нет такой возможности. Может есть другие предложения?
...
Рейтинг: 0 / 0
30.04.2015, 23:10
    #38950129
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
lex452,

например, читать как-то так:
Код: c#
1.
2.
3.
4.
5.
using (var reader = XmlReader.Create("test.xml"))
{
    reader.ReadToFollowing("start");
    ds.ReadXml(reader);
}


Так получается одна таблица в датасете. Поэтому можно ограничиться созданием лишь дататейбла.
Если нужны одновременно обе таблицы в датасете, то читать их по отдельности в два DataTable, добавив их потом в сет.

Сохранять тоже наполовину вручную.
...
Рейтинг: 0 / 0
30.04.2015, 23:13
    #38950131
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
lex452нет такой возможности. Может есть другие предложения?
Такая возможность есть всегда. XSLT.
...
Рейтинг: 0 / 0
01.05.2015, 12:58
    #38950251
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
В том и проблема что вручную не очень-то хочется изобретать велосипед
...
Рейтинг: 0 / 0
01.05.2015, 15:57
    #38950295
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
lex452В том и проблема что вручную не очень-то хочется изобретать велосипед
Тут действительно изобретать ничего не нужно:
Код: xml
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.
30.
31.
32.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="start | end">
    <xsl:param name="TableName" />
    <xsl:variable name="tableName">
      <xsl:choose>
        <xsl:when test="self::start">
          <xsl:text>StartTable</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>EndTable</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:apply-templates>
      <xsl:with-param name="TableName" select="$tableName"/>
    </xsl:apply-templates>
  </xsl:template>
  <xsl:template match="table">
    <xsl:param name="TableName"/>
    <xsl:element name="{$TableName}">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var srcXml = new XmlDocument();
srcXml.LoadXml(Properties.Resources.Xml);
var xsl = new XslCompiledTransform();
using(var sr = new StringReader(Properties.Resources.Xsl))
using(var xr = XmlReader.Create(sr))
  xsl.Load(xr);
var dstXml = new XmlDocument();
using(var xw = dstXml.CreateNavigator().AppendChild())
  xsl.Transform(srcXml, xw);
var ds = new DataSet();
using(var xnr = new XmlNodeReader(dstXml))
  ds.ReadXml(xnr);
...
Рейтинг: 0 / 0
01.05.2015, 16:10
    #38950299
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
Можно даже проще:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="start">
    <xsl:element name="StartTable">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>
  <xsl:template match="end">
    <xsl:element name="EndTable">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>
  <xsl:template match="table">
    <xsl:apply-templates />
  </xsl:template>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
01.05.2015, 19:34
    #38950339
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
Я вообще не знаком с xslt. Не сталкивался никогда, но спасибо, придется почитать поразбираться, может подскажите источник где более или менее доступно описано?
...
Рейтинг: 0 / 0
01.05.2015, 20:51
    #38950364
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
lex452,

Если с xslt сложности, можно без него.
Читаем:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DataSet ds1 = new DataSet();
DataSet ds2 = new DataSet();

using (var reader = XmlReader.Create("test.xml"))
{
    reader.ReadToFollowing("start");
    ds1.ReadXml(reader);
    ds2.ReadXml(reader);
}

dataGridView1.DataSource = ds1.Tables["table"]; //ds2.Tables["table"];



Пишем:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;

using (var writer = XmlWriter.Create("test.xml", settings))
{
    writer.WriteStartElement("Doc");
    writer.WriteAttributeString("version", "2");

    ds1.WriteXml(writer);
    ds2.WriteXml(writer);
}
...
Рейтинг: 0 / 0
01.05.2015, 21:19
    #38950370
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
petalvik,

Спасибо огромное, это по ходу как раз то что нужно
...
Рейтинг: 0 / 0
05.05.2015, 19:48
    #38952120
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
теперь проблема немного в другом, есть файл немного отличный от первоначального
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<Doc>
<first>
	<start> 
		<table>
		     <col1>1</col1>
		     <col2>2</col2>
		</table>
	</start>
</first>
 
<second>
	<start> 
		<table>
		     <col1>1</col1>
		     <col2>2</col2>
		</table>
	</start>
</second>
</Doc >


считываю его способом
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DataSet ds1 = new DataSet();
DataSet ds2 = new DataSet();

using (var reader = XmlReader.Create("test.xml"))
{
    reader.ReadToFollowing("start");
    ds1.ReadXml(reader);
    ds2.ReadXml(reader);
}

dataGridView1.DataSource = ds1.Tables["table"];



но когда в dataGridView1 добавляю новую строку например со значениями 44 и 55
то в итоге получаю
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<Doc version="2">
  <first>
    <start>
      <table>
        <col1>1</col1>
        <col2>2</col2>
      </table>
    </start>
    <table>
      <col1>44</col1>
      <col2>55</col2>
    </table>
  </first>
  <second>
    <start>
      <table>
        <col1>1</col1>
        <col2>2</col2>
      </table>
    </start>
  </second>
</Doc>



хотя я рассчитывал чтобы NODE
Код: c#
1.
2.
3.
4.
<table>
      <col1>44</col1>
      <col2>55</col2>
    </table>


оказался внутри тега start
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Doc version="2">
  <first>
    <start>
      <table>
        <col1>1</col1>
        <col2>2</col2>
      </table>
      <table>
      <col1>44</col1>
      <col2>55</col2>
    </table>
    </start>
    
  </first>
  <second>
    <start>
      <table>
        <col1>1</col1>
        <col2>2</col2>
      </table>
    </start>
  </second>
</Doc>


а не после него, как это реализовать?
...
Рейтинг: 0 / 0
05.05.2015, 21:05
    #38952161
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
Как я понял, местоположение зависит от ключа родителя указанного в строке, но он не отображается визуально, а доступен только в свойстве row.ItemsArray
вот я и нашел деревянный способ решения своей проблемы
Код: c#
1.
2.
3.
4.
5.
6.
7.
 
               for (int i = 0; i < ds1.Tables["table"].Rows.Count; i++)
                {
                    object[] obj = ds1.Tables["table"].Rows[i].ItemArray;
                    obj[2] = 0;
                    ds1.Tables["table"].Rows[i].ItemArray = obj;
                }


вручную проставлять номер ключа родителя

obj[2] это невидимый в datagrigview столбец
при ручном добавлении строки в datagrigview значение obj[2] пустое, и если добавить ему номер родителя то получается то что нужно,
но способ этот мне кажется каким-то тупым и подойдет думаю только для небольших объемов.
Если кто знает более элегантное решение то не стесняемся и помогаем)
...
Рейтинг: 0 / 0
05.05.2015, 21:17
    #38952167
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
lex452,
и как часто будет меняться формат файла?
Будет ли он меняться уже когда приложение будет работать? В таком случае действительно есть смысл использовать xslt - код трансформации можно менять, не перекомпилируя само приложение.

Код: c#
1.
2.
3.
4.
5.
6.
7.
using (var reader = XmlReader.Create("test.xml"))
{
    reader.ReadToFollowing("start");
    ds1.ReadXml(reader);
    reader.ReadToFollowing("start");
    ds2.ReadXml(reader);
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
using (var writer = XmlWriter.Create("test2.xml", settings))
{
    writer.WriteStartElement("Doc");
    //writer.WriteAttributeString("version", "2");

    writer.WriteStartElement("first");
    ds1.WriteXml(writer);
    writer.WriteEndElement();

    writer.WriteStartElement("second");
    ds2.WriteXml(writer);
    //writer.WriteEndElement(); // необязательно, само закроется
}



lex452Если кто знает более элегантное решение то не стесняемся и помогаем
Мне на Лексус немного не хватает, не стесняемся, помогаем...
...
Рейтинг: 0 / 0
05.05.2015, 21:30
    #38952173
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML и DataSet отображение различных таблиц для различных родителей
Просто на самом деле xml не такой простой как я привожу, просто я думал что главное считать файл, а при добавлении строки она впишется в нужное место но оказалось все не так просто.
А вы предлагаете считывать более простые ноды, а родителей при сохранении прописывать им вручную?
Тоже решение, Спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XML и DataSet отображение различных таблиц для различных родителей / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]