Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何从VisualBasic中的KML文件中提取单个/子节点?_Vb.net_Linq_Kml_Xmlreader - Fatal编程技术网

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
我得到以下输出:-


这正是我需要的。你的解释有助于我更好地理解如何取得这些成果。非常感谢。