C# XML不断更新值
我试图让一个程序连续地将数据写入文件中的XML节点,但我不确定如何实现它。XML文件是Google Earth kml文件,需要坐标才能绘制路径: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 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?我也来看看这种方法。谢谢你,奥利弗!我也会看看这个方法。谢谢你,奥利弗!