每次单击鼠标,都会将数据添加到xml文件中

时间:2011-07-03 12:04:08

标签: c# .net xml mouseevent linq-to-xml

每次鼠标事件发生时我都要将数据添加到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 个答案:

答案 0 :(得分:1)

当您使用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(...);

答案 1 :(得分:1)

这里的问题似乎是事实上(作为异常状态)没有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");

未经测试(此计算机上没有可视工作室)。