我有一个数据集"AllEventData",在该数据集中(目前)只有一个名为buttonData的表。 它有 3 列 - 一个自动递增的数字主键、一个名称(typeof(string))和一个矩形。 第三列是专门类型(矩形)。 我用数据表面板显示这一切。
我做了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时,它只会用按钮名称填充数据表面板,而不是矩形位置。
我尝试单独写入架构:
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 编写的内容?
正如 Olivier 在注释中指出的那样,矩形对于 XML 来说太复杂了,即使它可以分解它们并且看起来可以正常工作。 即使使用架构,它也不可能像编写它一样读取它。 因此,正确阅读它的"诀窍"是:
- 编写一个代码块来分析 XML,如"如何分析 xml"链接中所述 序列化和反序列化
- 矩形,如"如何序列化/反序列化"链接中所述
- 首先,将数据以完全不同的方式存储在表中。
后者是我最终选择做的。 对我来说,从矩形中提取 X、Y、宽度和高度并将它们存储在表格的各个列中真的很容易(这也让我存储了我试图弄清楚如何添加的另一段数据),然后在以后需要它们时将它们重新转换为矩形, 它也使用户更容易编辑矩形。
这样做,我可以简单地使用AllEventData.WriteXML和AllEventData.ReadXML,而无需进一步的代码。