powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XML и DataSet отображение различных таблиц для различных родителей
15 сообщений из 15, страница 1 из 1
XML и DataSet отображение различных таблиц для различных родителей
    #38950049
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть файл 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
XML и DataSet отображение различных таблиц для различных родителей
    #38950085
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XML и DataSet отображение различных таблиц для различных родителей
    #38950104
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет такой возможности. Может есть другие предложения?
...
Рейтинг: 0 / 0
XML и DataSet отображение различных таблиц для различных родителей
    #38950129
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

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


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

Сохранять тоже наполовину вручную.
...
Рейтинг: 0 / 0
XML и DataSet отображение различных таблиц для различных родителей
    #38950131
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452нет такой возможности. Может есть другие предложения?
Такая возможность есть всегда. XSLT.
...
Рейтинг: 0 / 0
XML и DataSet отображение различных таблиц для различных родителей
    #38950251
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том и проблема что вручную не очень-то хочется изобретать велосипед
...
Рейтинг: 0 / 0
XML и DataSet отображение различных таблиц для различных родителей
    #38950295
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XML и DataSet отображение различных таблиц для различных родителей
    #38950299
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно даже проще:
Код: 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
XML и DataSet отображение различных таблиц для различных родителей
    #38950339
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще не знаком с xslt. Не сталкивался никогда, но спасибо, придется почитать поразбираться, может подскажите источник где более или менее доступно описано?
...
Рейтинг: 0 / 0
XML и DataSet отображение различных таблиц для различных родителей
    #38950364
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XML и DataSet отображение различных таблиц для различных родителей
    #38950370
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik,

Спасибо огромное, это по ходу как раз то что нужно
...
Рейтинг: 0 / 0
XML и DataSet отображение различных таблиц для различных родителей
    #38952120
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь проблема немного в другом, есть файл немного отличный от первоначального
Код: 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
XML и DataSet отображение различных таблиц для различных родителей
    #38952161
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял, местоположение зависит от ключа родителя указанного в строке, но он не отображается визуально, а доступен только в свойстве 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
XML и DataSet отображение различных таблиц для различных родителей
    #38952167
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
XML и DataSet отображение различных таблиц для различных родителей
    #38952173
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто на самом деле xml не такой простой как я привожу, просто я думал что главное считать файл, а при добавлении строки она впишется в нужное место но оказалось все не так просто.
А вы предлагаете считывать более простые ноды, а родителей при сохранении прописывать им вручную?
Тоже решение, Спасибо за помощь.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XML и DataSet отображение различных таблиц для различных родителей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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