如何从 VisualBasic 中的 KML 文件中提取 individual/child 个节点?

How to extract individual/child nodes from a KML file in VisualBasic?

我需要能够从此文件中提取单个节点到变量中以供进一步操作。我正在写入控制台以查看正在提取哪些信息,但我正在努力提取名称或描述。

我可以成功打印整个文件。我已经尝试使用 placemark.<name>.Valueplacemark.Element("name").Value 获取单个节点,其中第二个抛出 NullReferenceException。关于如何在这种情况下提取名称和描述有什么想法吗?

Imports System.Xml
Imports System.Xml.Linq 'Visual Studio 2015 tells me this isn't needed
Imports System.Core 'Visual Studio 2015 tells me this isn't needed

Dim file As XDocument = XDocument.Load(filePath)

    Dim placemarks As IEnumerable(Of XElement) = From test In file.Root.Elements()

            For Each placemark As XElement In placemarks
                Console.WriteLine(placemark) 'This works
                Console.WriteLine(placemark.<name>.Value) 'This prints an empty line
                Console.WriteLine(placemark.Element("description").Value) 'This throws a NullReferenceException
            Next

这是结构

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'>
    <Document>
        <name>Untitled layer</name>
        <Placemark>
            <name>Name 1</name>
            <description>Description 1</description>
            <ExtendedData>
                <Data name='Test data one'>
                    <value>Test data 1</value>
                </Data>
            </ExtendedData>
            <Point>
                <coordinates>34725567547</coordinates>
            </Point>
        </Placemark>
        <Placemark>
            <name>Name 2</name>
            <description>Description 2</description>
            <ExtendedData>
                <Data name='Test data two'>
                    <value>Test data 2</value>
                </Data>
            </ExtendedData>
            <Point>
                <coordinates>056795763767</coordinates>
            </Point>
        </Placemark>

如果我没理解错的话,您是在尝试获取 PlaceMark 节点内的 namedescription。但是,由于您只获取 Root.Elements(),因此您的查询只会从您的根节点开始获取完整的 XML。

您需要找到 PlaceMark 节点的后代,因为您需要获取其中的名称和描述。此外,由于根节点 kml 包含命名空间,因此您也需要指定它。

代码如下:-

Dim ns As XNamespace = "http://www.opengis.net/kml/2.2"
Dim placeMarks = From test In file.Root.Element(ns + "Document")
                                  .Descendants(ns + "Placemark") Select test

For Each pm In placeMarks
     Console.WriteLine("Name: {0}", pm.Element(ns + "name").Value)
     Console.WriteLine("Description: {0}", pm.Element(ns + "description").Value)
     Console.WriteLine()
Next

我得到以下输出:-