如何使用C#将数据附加到XML文件中
本文关键字:XML 文件 何使用 数据 | 更新日期: 2023-09-27 18:00:15
我在图片框中加载了一个图像。当我点击图像时,会有一些数据(此处不需要)存储在XML文件中。但问题是,每当我在图像上点击鼠标时,数据就会被重写。相反,我需要添加每次鼠标点击后获得的数据。这是我在鼠标点击事件下的程序部分。
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
float u = l[p + 1] - l[p];
float v = m[p + 1] - m[p];
float w = (e.Y - m[p]) / v; //subtract from latitude
float z = (e.X - l[p]) / u; //add to longitude.
float latmin = h[p] - w;
float longmin = j[p] + z;
A1 = e.X - c[p];
A2 = e.Y - d[p];
B1 = c[p + 1] - c[p];
B2 = d[p + 1] - d[p];
A = Math.Sqrt(Math.Pow(A1, 2) + Math.Pow(A2, 2));
B = Math.Sqrt(Math.Pow(B1, 2) + Math.Pow(B2, 2));
dotproduct = A1 * B1 + A2 * B2;
theta = (180 / Math.PI) * Math.Acos( dotproduct / (A * B));
if (e.X < c[p])
{
theta1 = 360 - theta;
}
else
{
theta1 = theta;
}
MessageBox.Show(string.Format(" Latitude:{0}°{1:0.0}''n Longitude:{2}°{3:0.0}' 'n ICAO LOC: {4} {5}", g[p] + (int)latmin / 60, latmin % 60, i[p] + (int)longmin / 60, longmin % 60, textBox1.Text, Math.Abs((int)theta1)));
using (XmlWriter writer = XmlWriter.Create(string.Format("{0}.xml", textBox2.Text)))
{
writer.WriteStartDocument();
writer.WriteStartElement("WayPoints");
writer.WriteStartElement("Latitude");
writer.WriteElementString("Degrees",XmlConvert.ToString( g[p] + (int)latmin / 60));
writer.WriteElementString("Minutes", XmlConvert.ToString(latmin % 60));
writer.WriteEndElement();
writer.WriteStartElement("Longitude");
writer.WriteElementString("Degrees", XmlConvert.ToString(i[p] + (int)longmin / 60));
writer.WriteElementString("Minutes", XmlConvert.ToString(longmin % 60));
writer.WriteEndElement();
writer.WriteStartElement("IcaoLocator");
writer.WriteElementString("Type", textBox1.Text);
writer.WriteElementString("Angle", XmlConvert.ToString(Math.Abs((int)theta1)));
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
XML的文件名取自文本框2中的文本2。
请给我一些建议,这样我就可以将所有鼠标点击的数据存储在一个文件中。
使用xml的include特性。
这个想法是有一个"主"文件来保存文档声明,还有一个"子"文件来存放内部节点。在这种情况下,您可以简单地将文本附加到子文件中,主文件将保持有效。
master.xml文件:
<?xml version="1.0"?>
<WayPoints xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="slave.xmlpart"/>
</WayPoints>
slave.xml部分:
<WayPoint>
<Latitude>
<Degrees>1</Degrees>
</Latitude>
<Longitude>
<Degrees>1</Degrees>
</Longitude>
</WayPoint>
<WayPoint>
<Latitude>
<Degrees>2</Degrees>
</Latitude>
<Longitude>
<Degrees>2</Degrees>
</Longitude>
<WayPoint>
这将使您既受益于Xml标准,又受益于文本编写的性能。只是,您必须使用File.AppendText,而不是XmlWriter类,才能使用从属文件。如果您仍然想使用XmlWriter,可以在将流的内容附加到从属文件之前,在构建节点的位置使用临时MemoryStream。
[编辑]这里有一个示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
EnsureFiles();
Console.WriteLine("Press espace to quit");
ConsoleKeyInfo key;
do
{
key = Console.ReadKey();
Append(key);
}
while (key.Key != ConsoleKey.Escape);
Console.ReadLine();
}
private static void Append(ConsoleKeyInfo key)
{
var keyEvent = new XElement("KeyEvent",
new XElement("Key", new XAttribute("key", key.Key.ToString())),
new XElement("At", DateTime.Now.ToString())
);
File.AppendAllText("slave.xmlpart", keyEvent.ToString());
}
private static void EnsureFiles()
{
if (!File.Exists("slave.xmlpart"))
{
File.WriteAllText("slave.xmlpart", ""); // simply create the file
}
if (!File.Exists("master.xml"))
{
var doc = new XDocument(
new XElement("WayPoints",
new XElement("{http://www.w3.org/2001/XInclude}include",
new XAttribute("href", "slave.xmlpart")
)
)
);
doc.Save("master.xml");
}
}
}
}
然而,Xdocument类似乎没有遵循includes,但本文展示了一个解决方案:http://www.catarsa.com/Blog/Kohler-Radim/2010/5/Linq-To-Xml-XInclude
我将在类中使用XmlDocument
的实例,并在任何鼠标单击时向其附加适当的节点。您可以每次将文档保存在磁盘上(效率不太高,但如果文件不是很大,您不会注意到任何性能下降),也可以在其他场合延迟保存(显式按钮或窗口关闭)
您可以考虑使用XDocument,它是System.Xml.Linq命名空间的一部分。这种形式的XML文档为您提供了一个更容易阅读和修改XML文档的API,利用常见的liq功能。这里有一个详细的MSDN链接。
要添加节点,您可以执行以下操作:
XDocument xmlDocument = XDocument.Load("FilePath");
XElement parentNode = xmlDocument.Root.Element("ParentNode");
XElement node = new XElement("NodeName");
parentNode.Add(node);
xmlDocument.Save("FilePath");
这是一个简单的例子,没有实现任何null检查,并且假设父节点只有一个实例。
希望能有所帮助。
Paul