powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Атрибуты в XML
12 сообщений из 12, страница 1 из 1
Атрибуты в XML
    #38611738
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Существует xml файл настроек:

<?xml version="1.0" encoding="Windows-1251" ?>
<Nodes>
<Node Attr1="True" Attr2="текст2" Attr3="текст3"> </Node>
</Nodes>

я считываю его в DataSet через XmlReader

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

Вопрос №1:
Если у меня значения Attr1=True или False, то как мне сделать чтобы DataGridView воспринимал их bool, а не как текст
это нужно для того чтобы поле отображалось как checkbox.

Вопрос №2:
После внесения изменений в таблицу, я сохраняю их обратно в xml файл, с помощью xmlWriter.
И тут возникает проблема: сбивается все форматирование файла, то есть удаляются все переносы строк и табуляции. Xml файл становится одной строкой. Как сохранить исходный формат файла?
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38611764
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

1. xsd и DataTable.ReadXmlSchema
2. XmlWriterSettings.
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38611789
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно даже без xsd. Достаточно в метод DataSet.ReadXml передать параметр XmlReadMode.InferSchema или InferTypedSchema. При этом столбец со значениями True/False будет автоматически определён как булев и представлен чекбоксом. Но в некоторых случаях вывод схемы может не подойти.
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38611870
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не получается

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
private DataSet ds=new DataSet();
        private void Form1_Load(object sender, EventArgs e)
        {
            XmlReader xr = new XmlTextReader("xmltest.xml");

            ds.ReadXml(xr, XmlReadMode.InferTypedSchema);
            dataGridView1.DataSource = ds.Tables["Node"];
        }
//далее меняю данные средствами dataGridView1 и пытаюсь сохранить измененный dataset но опять форматирование слетает и True и False автоматом не определяются

        private void button1_Click(object sender, EventArgs e)
        {
            XmlWriterSettings xs=new XmlWriterSettings();
            xs.Encoding = Encoding.GetEncoding(1251);
            XmlWriter xw = XmlWriter.Create("xmltest2.xml",xs);
            
            

            ds.WriteXml(xw,XmlWriteMode.IgnoreSchema);
            xw.Close();
            
        }
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38611876
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

C форматированием разобрался, а вот сделать чтобы True и False определялись как CheckBox не получается
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38612294
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

если в атрибуте True заменить на true (с маленькой буквы), то вывод схемы должен работать.
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38612434
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik,

не получается все равно.
Нашел решение
Ставим свойство Datagridview.AutoGenerateColumns = false
и создаем нужные нам колонки с именами как у атрибутов xml файлов
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38612476
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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" standalone="yes"?>
<xs:schema id="NewDataSet"
  xmlns=""
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element
    name="NewDataSet"
    msdata:IsDataSet="true"
    msdata:MainDataTable="mydata"
    msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="mydata">
          <xs:complexType>
            <xs:attribute name="a" type="xs:boolean" />
            <xs:attribute name="b" type="xs:int" />
            <xs:attribute name="c" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>


Код: xml
1.
2.
3.
4.
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <mydata a="true" b="1" c="true"/>
</root>


Код: c#
1.
2.
3.
4.
5.
6.
var dt = new DataTable();
dt.ReadXmlSchema(@"D:\Trash\1.xsd");
dt.ReadXml(@"D:\Trash\1.xml");
foreach (DataRow r in dt.Rows)
  for (var i = 0; i < dt.Columns.Count;i++ )
    Console.WriteLine("{0} {1}", r[i], r[i].GetType());


Вывод:

Код: plaintext
1.
2.
True System.Boolean
1 System.Int32
true System.String
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38612526
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452petalvik,

не получается все равно.

*Ворчливо* Что там может не получаться?
(этот код размещён в конструкторе формы)
Код: c#
1.
2.
3.
4.
5.
6.
7.
var dgv = new DataGridView { Parent = this, Dock = DockStyle.Fill };
var ds = new DataSet();

ds.ReadXml("1.xml", XmlReadMode.InferTypedSchema);
dgv.DataSource = ds.Tables[0];

ds.WriteXml("2.xml");


Будет true - будет чекбокс.
WriteXml по умолчанию пишет форматированно, с отступами.
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38613068
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik,

А сейчас реально получилось с true, когда True то не получается.

При сохранении, если использовать
ds.WriteXml("1.xml");

то форматирование сохраняется, только вот кодировка не та что нужно.

а если использовать
Код: c#
1.
2.
3.
4.
5.
 XmlWriterSettings xs = new XmlWriterSettings();
  xs.Encoding = Encoding.GetEncoding(1251);
  XmlWriter xw = XmlWriter.Create("xmltest2.xml", xs);

  ds.WriteXml(xw);


то с кодировкой все отлично, но файл одной строкой.
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38613135
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452когда True то не получается.
Потому что
3.2.2 boolean
[Definition:] boolean has the value space required to support the mathematical concept of binary-valued logic: {true, false}.
3.2.2.1 Lexical representation
An instance of a datatype that is defined as ·boolean· can have the following legal literals {true, false, 1, 0} .
3.2.2.2 Canonical representation
The canonical representation for boolean is the set of literals {true, false} .

http://www.w3.org/TR/xmlschema-2/#boolean

lex452а если использовать
Код: c#
1.
2.
3.
4.
5.
 XmlWriterSettings xs = new XmlWriterSettings();
  xs.Encoding = Encoding.GetEncoding(1251);
  XmlWriter xw = XmlWriter.Create("xmltest2.xml", xs);

  ds.WriteXml(xw);


то с кодировкой все отлично, но файл одной строкой.
Ну про XmlWriterSettings.Encoding вы прочитали - потрудитесь прочитать про прочие свойства этого класса.
...
Рейтинг: 0 / 0
Атрибуты в XML
    #38613278
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите другой момент, в одном из атрибутов содержатся данные в виде числа перед которым стоят нули (например 0023), при считывании в datset эти нули обрезаются и столбец воспринимается как int, как этого можно избежать? мне нужно чтобы нули оставались на месте.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Атрибуты в XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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