2

ファイル内の 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?
4

2 に答える 2

0

これを盛り上げただけ。同じことをより速く達成する方法があるかどうかはわかりません。しかし、私にとってはうまくいきます。

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;
        }
    }
}
于 2012-10-04T16:15:48.380 に答える
0

毎回 XML ファイル全体を書き直す必要があります。XML ファイルの一部だけを更新する方法はありません。ファイルが大きくなるにつれて、プロセスは徐々に遅くなります。代わりに、プレーン テキスト ファイルの使用を検討してください。

File.AppendAllText(path, newText);

または (.NET 4.0 以降)

File.AppendAllLines(path, stringEnumeration);

XML ファイル内からこのテキスト ファイルを参照することもできます。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:xlink="http://www.w3.org/1999/xlink">
  <Document>
    <Style>
      <LineStyle>
        <color>7f00ffff</color>
        <width>4</width>
      </LineStyle>
    </Style>
    <Placemark>
      <LineString>
        <altitudeMode>clampToGround</altitudeMode>
        <coordinates xlink:href="http://mysite.com/data/coordinates.txt"/>
      </LineString>
    </Placemark>
  </Document>
</kml>
于 2012-10-04T20:10:46.613 に答える