Атрибуты в XML

lex452
Дата: 10.04.2014 19:17:11
Существует 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 файл становится одной строкой. Как сохранить исходный формат файла?
Сон Веры Павловны
Дата: 10.04.2014 19:48:35
lex452,

1. xsd и DataTable.ReadXmlSchema
2. XmlWriterSettings.
petalvik
Дата: 10.04.2014 20:25:39
Можно даже без xsd. Достаточно в метод DataSet.ReadXml передать параметр XmlReadMode.InferSchema или InferTypedSchema. При этом столбец со значениями True/False будет автоматически определён как булев и представлен чекбоксом. Но в некоторых случаях вывод схемы может не подойти.
lex452
Дата: 10.04.2014 22:35:13
не получается

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();
            
        }
lex452
Дата: 10.04.2014 22:43:52
lex452,

C форматированием разобрался, а вот сделать чтобы True и False определялись как CheckBox не получается
petalvik
Дата: 11.04.2014 13:42:11
lex452,

если в атрибуте True заменить на true (с маленькой буквы), то вывод схемы должен работать.
lex452
Дата: 11.04.2014 14:54:40
petalvik,

не получается все равно.
Нашел решение
Ставим свойство Datagridview.AutoGenerateColumns = false
и создаем нужные нам колонки с именами как у атрибутов xml файлов
Сон Веры Павловны
Дата: 11.04.2014 15:18:57
<?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 version="1.0" encoding="UTF-8"?>
<root>
  <mydata a="true" b="1" c="true"/>
</root>

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());

Вывод:

True System.Boolean
1 System.Int32
true System.String
petalvik
Дата: 11.04.2014 15:52:37
lex452
petalvik,

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


*Ворчливо* Что там может не получаться?
(этот код размещён в конструкторе формы)
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 по умолчанию пишет форматированно, с отступами.
lex452
Дата: 12.04.2014 12:31:19
petalvik,

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

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

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

а если использовать
 XmlWriterSettings xs = new XmlWriterSettings();
  xs.Encoding = Encoding.GetEncoding(1251);
  XmlWriter xw = XmlWriter.Create("xmltest2.xml", xs);

  ds.WriteXml(xw);

то с кодировкой все отлично, но файл одной строкой.