如何从 VisualBasic 中的 KML 文件中提取 individual/child 个节点?
How to extract individual/child nodes from a KML file in VisualBasic?
我需要能够从此文件中提取单个节点到变量中以供进一步操作。我正在写入控制台以查看正在提取哪些信息,但我正在努力提取名称或描述。
我可以成功打印整个文件。我已经尝试使用 placemark.<name>.Value
和 placemark.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
节点内的 name
和 description
。但是,由于您只获取 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
我得到以下输出:-
我需要能够从此文件中提取单个节点到变量中以供进一步操作。我正在写入控制台以查看正在提取哪些信息,但我正在努力提取名称或描述。
我可以成功打印整个文件。我已经尝试使用 placemark.<name>.Value
和 placemark.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
节点内的 name
和 description
。但是,由于您只获取 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
我得到以下输出:-