带有矩形的C#ReadXML

时间:2019-03-21 20:06:55

标签: c# readxml

我有一个数据集“ AllEventData”,并且在该数据集中(目前)只有一个名为buttonData的表。它具有3列-自动递增数字主键,名称(typeof(string))和矩形。第三列是typeof(Rectangle)。我用datatablepanel显示所有内容。

我使用AllEventData.WriteXML方法编写了没有特殊参数的文件,而且看起来工作正常-我得到的文件看起来像这样:

<?xml version="1.0" standalone="yes"?>
<AllEventData>
  <ButtonData>
    <ID>1</ID>
    <Button_x0020_Name>sdfh</Button_x0020_Name>
    <Button_x005F_x0020_Location xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Location>
        <X>480</X>
        <Y>186</Y>
      </Location>
      <Size>
        <Width>95</Width>
        <Height>67</Height>
      </Size>
      <X>480</X>
      <Y>186</Y>
      <Width>95</Width>
      <Height>67</Height>
    </Button_x005F_x0020_Location>
  </ButtonData>
</AllEventData>

但是当我对同一个文件执行AllEventData.ReadXML时,它仅使用按钮名称而不是矩形位置填充datatablepanel。

我尝试单独编写模式:

        using (SaveFileDialog saveFileDialog1 = new SaveFileDialog())
        {
            saveFileDialog1.Filter = "XML | *.xml";
            saveFileDialog1.Title = "Save File";
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                AllEventData.WriteXml(saveFileDialog1.FileName);
                string xsdFileName = saveFileDialog1.FileName.Substring(0, saveFileDialog1.FileName.Length - 3) + "xsd";
                AllEventData.WriteXmlSchema(xsdFileName);
            }
        }

以及与之相反的基本内容,可以使用模式读取它:

        using (OpenFileDialog openFileDialog1 = new OpenFileDialog())
        {
            openFileDialog1.Filter = "XML | *.xml";
            openFileDialog1.Title = "Open File";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                AllEventData.Clear();
                string xsdFileName = openFileDialog1.FileName.Substring(0, openFileDialog1.FileName.Length - 3) + "xsd";
                AllEventData.ReadXmlSchema(xsdFileName);
                AllEventData.ReadXml(openFileDialog1.FileName);

            }
        }

但仍然无法到达那里。

为什么ReadXML不能读取WriteXML编写的内容?

1 个答案:

答案 0 :(得分:0)

正如奥利维尔(Olivier)在评论中指出的那样,矩形对于XML而言过于复杂,尽管它可以分解矩形并看起来可以正常工作。即使使用架构,它也永远不会像编写它一样读取它。因此,正确阅读它的“技巧”是:

  1. 按照“如何解析xml”链接中的说明编写一个代码块以解析XML
  2. 按照“如何序列化/反序列化”链接
  3. 所述对矩形进行序列化和反序列化。
  4. 首先将数据完全不同地存储在表中。

后者是我最终选择做的。对于我来说,从矩形中提取X,Y,宽度和高度并将它们存储在表的各个列中非常容易(这也让我存储了我试图弄清楚如何添加的另一段数据),然后在以后需要时将它们重新变成矩形,这也使编辑矩形更容易让用户找出来。

这样做,我可以简单地使用AllEventData.WriteXML和AllEventData.ReadXML,而无需更多代码。