Как добавить данные в файл XML с помощью C # - PullRequest
0 голосов
/ 22 июня 2011

У меня есть изображение, загруженное в графическое окно. Когда я нажимаю на изображение, появляются некоторые данные (здесь не обязательно), которые будут храниться в файле XML. Но проблема в том, что когда я щелкаю мышью по изображению, данные перезаписываются. Вместо этого мне нужно добавлять данные, полученные после каждого щелчка мыши. Моя часть программы находится под событием MouseClick.

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.

Пожалуйста, дайте мне несколько советов, чтобы я мог хранить данные всех щелчков мышью в одном файле.

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

использование включает в себя функции xml .

Идея состоит в том, чтобы иметь один «главный» файл, содержащий объявление документа, и «дочерний» файл, который содержит внутренние узлы.В этом случае вы можете просто добавить текст в дочерний файл, и мастер останется действительным.

файл master.xml:

<?xml version="1.0"?>

<WayPoints xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="slave.xmlpart"/>
</WayPoints>

slave.xmlpart:

<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, в котором вы строите узлы, прежде чем добавлять содержимое потока в подчиненный файл.

[Edit] - это пример кода:

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 не включает в себя включает, но эта статья показывает решение: http://www.catarsa.com/Blog/Kohler-Radim/2010/5/Linq-To-Xml-XInclude

1 голос
/ 22 июня 2011

Вы можете посмотреть на использование XDocument, который является частью пространства имен System.Xml.Linq. Эта форма XML-документа дает вам намного более удобный API для чтения и внесения поправок в XML-документы, используя обычную функциональность liq. Вот ссылка MSDN, в которой это подробно описано.

Чтобы добавить узел, вы можете сделать следующее:

XDocument xmlDocument = XDocument.Load("FilePath");
XElement parentNode = xmlDocument.Root.Element("ParentNode");
XElement node = new XElement("NodeName"); 
parentNode.Add(node);
xmlDocument.Save("FilePath");

Это простой пример, он не реализует никаких проверок на ноль и предполагает, что родительский узел имеет только один экземпляр.

Надеюсь, это поможет.

Пол

1 голос
/ 22 июня 2011

Я буду использовать экземпляр XmlDocument внутри класса, а добавлю к нему соответствующие узлы при любом щелчке мыши.Вы можете сохранять документ на диске каждый раз (не так эффективно, но вы не заметите какого-либо снижения производительности, если файл не очень большой) или отложить сохранение при некоторых других обстоятельствах (явная кнопка или закрытие окна)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...