H--
H--

Reputation: 95

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

I need to be able to extract individual nodes from this file into variables for further manipulation. I'm writing to the console to see what information is being pulled, but I am struggling to pull the name or description.

I can successfully print the entire file. I've tried getting individual nodes using placemark.<name>.Value and placemark.Element("name").Value, the second of which throws a NullReferenceException. Any ideas on how to be able to pull out the name and description in this instance?

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

This is the structure

<?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>

Upvotes: 1

Views: 1085

Answers (1)

Rahul Singh
Rahul Singh

Reputation: 21795

If I have understood you correctly, you are trying to fetch the name & description present inside the PlaceMark node. But, since you are only fetching Root.Elements() your query will only fetch the complete XML starting from your root node.

You need to find the Descendants of PlaceMark node because you need to fetch the name & description inside it. Also, since the root node kml consists of namespace you need to specify that as well.

Here is the code:-

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

I am getting following output:-

enter image description here

Upvotes: 1

Related Questions