【问题标题】:How to extract individual/child nodes from a KML file in VisualBasic?如何从 Visual Basic 中的 KML 文件中提取单个/子节点?
【发布时间】:2015-07-07 01:54:59
【问题描述】:

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

我可以成功打印整个文件。我尝试使用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>

【问题讨论】:

    标签: vb.net linq kml xmlreader


    【解决方案1】:

    如果我对您的理解正确,您正在尝试获取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
    

    我得到以下输出:-

    【讨论】:

    • 这正是我所需要的。您的解释有助于我更好地理解如何在未来取得这些成果。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多