C# XML不断更新值

C# XML不断更新值,c#,xml,linq,C#,Xml,Linq,我试图让一个程序连续地将数据写入文件中的XML节点,但我不确定如何实现它。XML文件是Google Earth kml文件,需要坐标才能绘制路径: <?xml version="1.0" encoding="utf-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Style> <LineStyle> <color&g

我试图让一个程序连续地将数据写入文件中的XML节点,但我不确定如何实现它。XML文件是Google Earth kml文件,需要坐标才能绘制路径:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <Style>
      <LineStyle>
        <color>7f00ffff</color>
        <width>4</width>
      </LineStyle>
    </Style>
    <Placemark>
      <LineString>
        <altitudeMode>clampToGround</altitudeMode>
        <coordinates>0,0,0</coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>
我只需要修改坐标节点并添加后续行。这将通过使用定时器每秒写入一组新的坐标来实现。这可能有数百行:

<coordinates> 
      -112.2550785337791,36.07954952145647,2357
      -112.2549277039738,36.08117083492122,2357
      -112.2552505069063,36.08260761307279,2357
      -112.2564540158376,36.08395660588506,2357
      -112.2580238976449,36.08511401044813,2357
      -112.2595218489022,36.08584355239394,2357

(...etc)

</coordinates>
我不太明白如何访问坐标节点并一个接一个地写入值。我尝试过类似的方法,但不起作用:

  XmlDocument dataFile = new XmlDocument();
  dataFile.Load("gpsData.kml");

  XmlNode node = dataFile.SelectSingleNode("kml/Document/Placemark/LineString/coordinates");

  node.InnerText (?) <- how do I append new text instead of replacing the whole thing?

刚刚把它搅起来。不确定是否有更快的方法来完成同样的事情。不过对我来说很有用

using System;
using System.Timers;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {

            var fileName = "C:\\gpsData.kml";

            var xml = XDocument.Load(fileName);
            var xmlns = xml.Root.Name.Namespace;
            var document = xml.Root.Element(xmlns.GetName("Document"));
            var placemark = document.Element(xmlns.GetName("Placemark"));
            var lineString = placemark.Element(xmlns.GetName("LineString"));
            var coordinates = lineString.Element(xmlns.GetName("coordinates"));

            var inc = 0;
            var timer = new Timer();
            var timer_Elapsed = new ElapsedEventHandler((s, e) => {

                // get the new coordinate here
                var newCoordinate = "-112.2550785337791,36.07954952145647,2357";
                var oldValue = coordinates.Value;
                var newValue = oldValue + Environment.NewLine + newCoordinate;
                coordinates.Value = newValue;

                xml.Save(fileName);

                inc++;
            });

            timer.Interval = 1000;
            timer.Elapsed += timer_Elapsed;
            timer.Start();

            while (10 > inc) ;

            timer.Stop();
            timer.Elapsed -= timer_Elapsed;
        }
    }
}

刚刚把它搅起来。不确定是否有更快的方法来完成同样的事情。不过对我来说很有用

using System;
using System.Timers;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {

            var fileName = "C:\\gpsData.kml";

            var xml = XDocument.Load(fileName);
            var xmlns = xml.Root.Name.Namespace;
            var document = xml.Root.Element(xmlns.GetName("Document"));
            var placemark = document.Element(xmlns.GetName("Placemark"));
            var lineString = placemark.Element(xmlns.GetName("LineString"));
            var coordinates = lineString.Element(xmlns.GetName("coordinates"));

            var inc = 0;
            var timer = new Timer();
            var timer_Elapsed = new ElapsedEventHandler((s, e) => {

                // get the new coordinate here
                var newCoordinate = "-112.2550785337791,36.07954952145647,2357";
                var oldValue = coordinates.Value;
                var newValue = oldValue + Environment.NewLine + newCoordinate;
                coordinates.Value = newValue;

                xml.Save(fileName);

                inc++;
            });

            timer.Interval = 1000;
            timer.Elapsed += timer_Elapsed;
            timer.Start();

            while (10 > inc) ;

            timer.Stop();
            timer.Elapsed -= timer_Elapsed;
        }
    }
}

每次都必须重写整个XML文件。无法仅更新XML文件的一部分。随着文件的增长,进程将依次减慢。考虑使用纯文本文件代替.< /P> File.AppendAllTextpath,newText; 或者从.NET4.0开始

File.AppendAllLinespath,stringEnumeration; 您还可以从XML文件中引用此文本文件

7f00ffff 4. 攀爬地面
每次都必须重写整个XML文件。无法仅更新XML文件的一部分。随着文件的增长,进程将依次减慢。考虑使用纯文本文件代替.< /P> File.AppendAllTextpath,newText; 或者从.NET4.0开始

File.AppendAllLinespath,stringEnumeration; 您还可以从XML文件中引用此文本文件

7f00ffff 4. 攀爬地面
您必须使用XmlDocument吗?是否可以使用LINQ转换为XML?node.InnerText=node.InnerText+myOtherText?是否必须使用XmlDocument?您可以改用LINQ转换为XML吗?node.InnerText=node.InnerText+myOtherText?我也来看看这种方法。谢谢你,奥利弗!我也会看看这个方法。谢谢你,奥利弗!