0

问题描述:

我有一个DataGrid。它由List填充。代码如下:

List<SomeClass> someClassList = new List<SomeClass>();
//Fill somClassList with data (omited for brevity)
myDataGrid.ItemsSource = someClassList;

有效,所有值都正确显示。用户现在可以编辑所有单元格并创建新行。用户单击某个按钮后,我想将该DataGrid中的保存到具有以下结构的XML 文件中:

<Root>
    <a>
        <b>val1</b>
        <c>val2</c>
        <d>
            <e>
                <f>val3</f>
                <g>val4</g>
                <h>val5</h>
                <i>val6</i>
            </e>
            <!--variable number of 'e'- tags with inner structure as above-->
        </d>
     </a>
     <!--variable number of 'a'-tags with inner structure as above-->
</Root>

出于这个原因,我决定逐行遍历 DataGrid会很聪明。因此 Button-Click-event-Handler 包含执行迭代的代码(每个值都由 WriteLine() 方法复制):

foreach (SomeClass someClassElement in myDataGrid.ItemsSource)
{
    Trace.WriteLine(someClassElement.b+ ", " + someClassElement.c+ ", " +
                    someClassElement.f + ", " + someClassElement.g + ", " +
                    someClassElement.h + ", " + someClassElement.i);
}

我现在必须将每一行写入一个XML 文件不幸的是,这似乎不是一项简单的任务,因为有两个内部标签的出现次数可变

到目前为止,我得到的是以下代码,它从我为清楚起见添加的示例 DataGrid生成同样附加的XML 文件

//Button click code
XmlDocument doc = new XmlDocument();
XmlNode myRoot = doc.CreateElement("Root");
XmlNode a,b,c,d,e;
String last_b_value = "0";
foreach (SomeClass someClassElement in myDataGrid.ItemsSource)
{
    String current_b_value = someClassElement.b;
    if (last_b_value != current_b_value)
    {
        //Creating XML-elements and setting text
        a = doc.CreateElement("a");
        b = doc.CreateElement("b");
        b.InnerText = someClassElement.b;
        c = doc.CreateElement("c");
        c.InnerText = someClassElement.c;
        d = doc.CreateElement("d");
        e = doc.CreateElement("e");

        a.AppendChild(b);
        a.AppendChild(c);
        a.AppendChild(d);
        d.AppendChild(e);
    }
}
doc.AppendChild(myRoot);
// Save document
string filename = dlg.FileName;
doc.Save(@filename);

这是输出的 XML 文件:

<root>
  <a>
    <b>val_1_1</b>
    <c>val_1_2</c>
    <d>
      <e />
      <!-- the varying number of 'e'-tags is not created correctly -->
    </d>
  </a>
  <a>
    <b>val_2_1</b>
    <c>val_2_2</c>
    <d>
      <e />
      <!-- the varying number of 'e'-tags is not created correctly -->
    </d>
  </a>
  <a>
     <b>val_3_1</b>
     <c>val_3_2</c>
     <d>
       <e />
       <!-- the varying number of 'e'-tags is not created correctly -->
     </d>
  </a>
  <!-- number of varying 'a'-tags is created correctly -->
</root>

这是示例-用户单击按钮后从中创建 XML 文件的DataGrid :

示例-Datagrid

该代码确实适当地处理可变数量的“a”标签,但缺乏在每个“a”标签内写入同样数量的“e ”标签的功能。

相反,输出XML 文件应如下所示

<Root>
  <a>
    <b>val_1_1</b>
    <c>val_1_2</c>
    <d>
          <e>
          <f>x1</f>
          <g>x1</g>
          <h>x1</h>
          <i>x1</i>
      </e>
      <e>
          <f>x2</f>
          <g>x2</g>
          <h>x2</h>
          <i>x2</i>
      </e>
      <e>
          <f>x3</f>
          <g>x3</g>
          <h>x3</h>
          <i>x3</i>
      </e>
    </d>
  </a>
  <a>
    <b>val_2_1</b>
    <c>val_2_2</c>
    <d>
      <e>
          <f>x4</f>
          <g>x4</g>
          <h>x4</h>
          <i>x4</i>
      </e>
      <e>
          <f>x5</f>
          <g>x5</g>
          <h>x5</h>
          <i>x5</i>
      </e>
    </d>
  </a>
  <a>
    <b>val_3_1</b>
    <c>val_3_2</c>
    <d>
      <e>
          <f>x6</f>
          <g>x6</g>
          <h>x6</h>
          <i>x6</i>
      </e>
    </d>
  </a>
</Root>

问题:

  1. 如何调整代码以创建缺少的“e”标签?
  2. 是否有更智能的方法来读取DataGrid并将其值保存到相同的结构化 XML 文件中?
4

1 回答 1

0

问题 1有一个简单的答案:

我必须将 if 子句调整为以下内容,才能正确构建 XML 输出:

  //Button click code
  XmlDocument doc = new XmlDocument();
  XmlNode myRoot = doc.CreateElement("Root");
  XmlNode a,b,c,d,e;
  String last_b_value = "0";
  foreach (SomeClass someClassElement in myDataGrid.ItemsSource)
  {
   String current_b_value = someClassElement.b;
   if (last_b_value != current_b_value)
   {
       //Creating XML-elements and setting text
       a = doc.CreateElement("a");
       b = doc.CreateElement("b");
       b.InnerText = someClassElement.b;
       c = doc.CreateElement("c");
       c.InnerText = someClassElement.c;
       d = doc.CreateElement("d");
       e = doc.CreateElement("e");


   }else if(last_b_value == current_b_value){
       e = doc.CreateElement("e");
   }
       a.AppendChild(b);
       a.AppendChild(c);
       a.AppendChild(d);
       d.AppendChild(e);
  }
  doc.AppendChild(myRoot);
  // Save document
  string filename = dlg.FileName;
  doc.Save(@filename);

使用这种结构的 if 子句,abcd 标记被省略。

于 2013-10-21T18:54:55.837 回答