добавлять данные в XML-файл при каждом щелчке мыши - PullRequest
0 голосов
/ 03 июля 2011

Мне нужно добавлять данные в XML-файл каждый раз, когда происходит событие мыши!вот мой код, я объясню вам лучше после того, как вы взгляните на него.

 private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
    {


            if (radioButton1.Checked==true)
            {
                if (a > 3 && a < 11)
                {

                    rect.Width = 0;
                    rect.Height = 0;
                    pictureBox1.Invalidate();


                 raghu =   img.imageToByteArray(pictureBox1.Image);


                    int radius = 10; //Set the number of pixel you want to use here
                    //Calculate the numbers based on radius
                    int x0 = Math.Max(e.X - (radius / 2), 0),
                        y0 = Math.Max(e.Y - (radius / 2), 0),
                        x1 = Math.Min(e.X + (radius / 2), pictureBox1.Width),
                        y1 = Math.Min(e.Y + (radius / 2), pictureBox1.Height);
                    Bitmap bm = pictureBox1.Image as Bitmap; //Get the bitmap (assuming it is stored that way)
                    for (int ix = x0; ix < x1; ix++)
                    {
                        for (int iy = y0; iy < y1; iy++)
                        {
                            bm.SetPixel(ix, iy, Color.Black); //Change the pixel color, maybe should be relative to bitmap
                        }
                    }
                    pictureBox1.Refresh(); //Force refresh

                    //calculation part.
                    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;
                    }
                    textBox2.Text = string.Format("Latitude:{0}°{1}'{2}''\n Longitude:{3}°{4}'{5}'' \n ICAO LOC: {6} {7} \n Distance: {8:0.0} Nm", g[p] + (int)latmin / 60, (int)latmin % 60,(int) (((h[p]-w) % 60 - (int)(latmin % 60)) * 60), i[p] + (int)longmin / 60, (int)longmin % 60, (int)((longmin % 60 - (int)(longmin % 60)) * 60), textBox1.Text, Math.Abs((int)theta1), Math.Sqrt(Math.Pow((A1/u)* 60, 2) + Math.Pow((A2/v) * 60, 2))); 

Существует большая часть вычислений, которая сейчас не нужна. Но данные, которые я собираюсь напечатать в textBox2(последняя строка кода) важно. все напечатанные там данные должны добавляться в файл XML каждый раз, когда я щелкаю мышью по картинке ...

, поэтому я попытался реализовать с помощью xdocument с помощьюдобавив этот путь ..

             XDocument xdoc = XDocument.Load(string.Format("{0}.xml", textBox3.Text));
                    XElement ParentNode= xdoc.Root.Element(string.Format("{0}",radioButton1.Text));
                    XElement node= new XElement("WayPoints",new XElement("LatitudeDegrees",g[p] + (int)latmin / 60 ,
                                     new XAttribute("Minutes",(int)latmin % 60),
                                         new XAttribute("Seconds",(int)(((h[p] - w) % 60 - (int)(latmin % 60)) * 60)),
                                            new XElement("LongitudeDegrees",i[p] + (int)longmin / 60,
                                                new XAttribute("Minutes",(int)longmin % 60),
                                                  new XAttribute("seconds",(int)((longmin % 60 - (int)(longmin % 60)) * 60)),
                                                     new XElement ("IcaoLocator",textBox1.Text,
                                                         new XAttribute("angle",Math.Abs((int)theta1)),
                                                         new XElement("DistanceInNauticalMiles",Math.Sqrt(Math.Pow((A1 / u) * 60, 2) + Math.Pow((A2 / v) * 60, 2))

                )))));
                    ParentNode.Add(node);
                    xdoc.Save(string.Format("{0}.xml", textBox3.Text));

Но проблема в том, что он говорит, что корневой элемент отсутствует.

На самом деле файл, который я загружаю в Xdocument, уже создан, я его уже создал

  using (XmlWriter writer = XmlWriter.Create(string.Format("{0}.xml", textBox3.Text)))
            { 
            }

ранее здесь, как это (потому что я боюсь, что если создать его, создается в Picturebox_Mouseclick, он перезаписывается)

 private void pictureBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {

            if (a > 1 && a <= 3)
            {
                c[f] = e.X;
                d[f] = e.Y;
                a++;
                f++;
            }
          using (XmlWriter writer = XmlWriter.Create(string.Format("{0}.xml", textBox3.Text)))
            { 
            }
    }        

Не беспокойтесь, если вы не понимаете вычисления, его характерно длямои потребности мне нужно только распечатать данные в XML-файл .. пожалуйста, любой любезно помогите мне ..

один из примеров путевой точки здесь

<?xml version="1.0" encoding="UTF-8"?>
<WayPoints>
  <Latitude>
    <Degrees>48</Degrees>
    <Minutes>31.7363644</Minutes>
  </Latitude>
  <Longitude>
    <Degrees>11</Degrees>
    <Minutes>57.53425</Minutes>
  </Longitude>
  <IcaoLocator>
    <Type>EDML</Type>
    <Angle>288</Angle>
    <DistanceInPixels>346</DistanceInPixels>
  </IcaoLocator>
</WayPoints>

, но он содержит только один способточка ... Мне нужно добавить много путевых точек в этот файл XML.

Ответы [ 2 ]

1 голос
/ 03 июля 2011

Проблема здесь заключается в том, что на самом деле (как говорится в исключении) нет корневого элемента для xml.Это можно исправить довольно просто, изменив макет XML на что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<WayPoints>
   <WayPoint>
      <Latitude>
        <Degrees>48</Degrees>
        <Minutes>31.7363644</Minutes>
      </Latitude>
      <Longitude>
        <Degrees>11</Degrees>
        <Minutes>57.53425</Minutes>
      </Longitude>
      <IcaoLocator>
        <Type>EDML</Type>
        <Angle>288</Angle>
        <DistanceInPixels>346</DistanceInPixels>
      </IcaoLocator>
   </WayPoint>
   <WayPoint> <!-- New waypoint here, not at the root -->
      <Latitude>
        <Degrees>48</Degrees>
        <Minutes>31.7363644</Minutes>
      </Latitude>
      <Longitude>
        <Degrees>11</Degrees>
        <Minutes>57.53425</Minutes>
      </Longitude>
      <IcaoLocator>
        <Type>EDML</Type>
        <Angle>288</Angle>
        <DistanceInPixels>346</DistanceInPixels>
      </IcaoLocator>
   </WayPoint>
</WayPoints>

Тогда вы сможете сделать это:

var doc = XDocument.Load("PATH_TO_FILE.xml");
doc.Element("WayPoints").Add(new XElement("WayPoint", 
    new XElement("Latitude",
        new XElement("Degrees", 48),
        new XElement("Minutes", 31.7363644),
    ),
    new XElement("Longitude",
        new XElement("Degrees", 48),
        new XElement("Minutes", 31.7363644),
    ),
    new XElement("IcaoLocator",
        new XElement("Type", "EDML"),
        new XElement("Angle", 288),
        new XElement("DistanceInPixels", 346)
    )
);
doc.Save("PATH_TO_FILE.xml");

Не проверено (нена этом компьютере нет визуальной студии).

1 голос
/ 03 июля 2011

Когда вы используете средство записи xml для создания файла xml, вы не помещаете в него какие-либо элементы, поэтому, когда XDocument переходит к его загрузке, он не находит корневой элемент и выдает исключение, которое вы получаете.

Я предлагаю пропустить xmlwriter и инициализировать XDocument для нового XDocument, если файл не существует:

XDocument xdoc;
if( File.Exist( string.Format("{0}.xml", textBox3.Text ) ) )
  xdoc = XDocument.Load( string.Format( "{0}.xml", textBox3.Text ) );
else
  xdoc = new XDocument(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...