0

我的目标是删除使用 sharpkml 读取的 kml 文件中的地标,并将 xml 保存为新的 kml。

我试过的

  • RemoveChildren -> 未找到
  • AddUpdate 与 DeleteCollection -> 不工作

using SharpKml.Base;
using SharpKml.Dom;
using SharpKml.Engine;

           
TextReader i_test = File.OpenText(@"test.kml");
KmlFile k_test = KmlFile.Load(i_test);
Kml l_test = k_test.Root as Kml;
var serializer = new Serializer();
if (l_test != null)
{
    foreach (var ort_u in l_test.Flatten().OfType<Placemark>())
    {
        Placemark p_u = ort_u;
        foreach(var einh in ort_u.ExtendedData.Data)
        {
            if (einh.Name == "teststring")
            {
                    var update = new Update();
                    update.AddUpdate(new DeleteCollection(){ p_u });
                    serializer.Serialize(l_test);
                    Console.WriteLine(serializer.Xml.Length);
            }
        }
    }
}

它们都不起作用。

如何使用 SharpKml 删除地标并将整个 kml 减去地标保存在新文件中?

4

1 回答 1

0

好的... APlacemark是 a Feature,并且Features 进入Containers... 而在Containers 中有一个恰当的命名.RemoveFeature()... 遗憾的是,该方法使用.Id来查找Feature,但并非所有Features 都有Id... 但是这个我们可以解决. 我们设置了一个临时的Id( Guid.NewGuid().ToString()),它或多或少保证是唯一的(Guid或多或少保证是唯一的),我们用它Id来删除Feature.

请注意,我必须在 中添加 a .ToArray()foreach因为您无法修改您正在浏览的集合,但.ToArray()我们会通过该集合的“副本”,同时从原始元素中删除元素。

foreach (var placemark in kml.Flatten().OfType<Placemark>().ToArray())
{
    if (placemark.Name == "Simple placemark")
    {
        placemark.Id = Guid.NewGuid().ToString();
        ((Container)placemark.Parent).RemoveFeature(placemark.Id);
    }

    Console.WriteLine(placemark.Name);
}

我在SharpKml 的 github 上打开了一个关于这件事的错误。

为了节省:

using (var stream = File.Create("output.kml"))
{
    var ser = new Serializer();
    ser.Serialize(kml, stream);
}
于 2021-01-02T16:05:17.370 回答