Vb.net 如何从VisualBasic中的KML文件中提取单个/子节点?
我需要能够将这个文件中的各个节点提取到变量中,以便进一步操作。我正在向控制台写信,查看正在提取哪些信息,但我很难提取名称或描述 我可以成功打印整个文件。我尝试使用Vb.net 如何从VisualBasic中的KML文件中提取单个/子节点?,vb.net,linq,kml,xmlreader,Vb.net,Linq,Kml,Xmlreader,我需要能够将这个文件中的各个节点提取到变量中,以便进一步操作。我正在向控制台写信,查看正在提取哪些信息,但我很难提取名称或描述 我可以成功打印整个文件。我尝试使用placemark..Value和placemark.Element(“name”).Value获取单个节点,其中第二个会引发NullReferenceException。关于如何在本例中提取名称和描述,有什么想法吗 Imports System.Xml Imports System.Xml.Linq 'Visual Studio 20
placemark..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
Imports System.Xml
Imports System.Xml.Linq的Visual Studio 2015告诉我这不是必需的
导入System.Core的Visual Studio 2015告诉我这是不需要的
作为XDocument=XDocument.Load(文件路径)的Dim文件
将placemarks的尺寸标注为IEnumerable(Of XElement)=来自文件.Root.Elements()中的测试
对于每个placemark作为placemarks中的元素
Console.WriteLine(placemark)'此功能有效
Console.WriteLine(placemark..Value)'这将打印一个空行
Console.WriteLine(placemark.Element(“description”).Value)”这会引发NullReferenceException
下一个
这就是结构
<?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>
无标题层
名字1
说明1
测试数据1
34725567547
名称2
说明2
测试数据2
056795763767
如果我理解正确,则您正在尝试获取PlaceMark
节点中存在的名称
和说明
。但是,由于您只获取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
我得到以下输出:-
这正是我需要的。你的解释有助于我更好地理解如何取得这些成果。非常感谢。