Разбор данных GML с использованием C # Linq в XML - PullRequest
5 голосов
/ 30 ноября 2009

Я знаю, что это, скорее всего, очень просто, и меня спрашивали тысячу раз, но по какой-то причине я просто не могу заставить его работать.

У меня есть файл gml, который выглядит следующим образом:

<?xml version='1.0' encoding='UTF-8'?>
<schema
xmlns='http://www.w3.org/2000/10/XMLSchema'
xmlns:gml='http://www.opengis.net/gml'
xmlns:xlink='http://www.w3.org/1999/xlink'
xmlns:xsi='http://www.w3.org/2000/10/XMLSchema-instance'
xsi:schemaLocation='http://www.opengis.net/gml/feature.xsd'>
<gml:Polygon srsName='http://www.opengis.net/gml/srs/epsg.xml#4283'>
 <gml:outerBoundaryIs>
  <gml:LinearRing>
   <gml:coord>
    <gml:X>152.035953</gml:X>
    <gml:Y>-28.2103190007845</gml:Y>
   </gml:coord>
   <gml:coord>
    <gml:X>152.035957</gml:X>
    <gml:Y>-28.2102020007845</gml:Y>
   </gml:coord>
   <gml:coord>
    <gml:X>152.034636</gml:X>
    <gml:Y>-28.2100120007845</gml:Y>
    </gml:coord>
   <gml:coord>
    <gml:X>152.034617</gml:X>
    <gml:Y>-28.2101390007845</gml:Y>
    </gml:coord>
   <gml:coord>
    <gml:X>152.035953</gml:X>
    <gml:Y>-28.2103190007845</gml:Y>
    </gml:coord>
  </gml:LinearRing>
 </gml:outerBoundaryIs>
</gml:Polygon>
</schema>

Все, что мне нужно, это прочитать X и Y с каждого узла gml :ordin. Я использую C # 3.0 и LINQ, так что это должно быть легко, но все, что я пытаюсь, просто возвращает пустые результаты.

Я только что произвел парсинг xml в VB, так что путь C # сейчас немного чужд для меня.

Спасибо, Nathan

1 Ответ

7 голосов
/ 30 ноября 2009

Я предполагаю, что вы не включили пространство имен. Вот короткая, но полная программа, которая показывает все координаты:

using System;
using System.Linq;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XDocument doc = XDocument.Load("test.xml");
        XNamespace gml = "http://www.opengis.net/gml";

        var query = doc.Descendants(gml + "coord")
            .Select(e => new { X = (decimal) e.Element(gml + "X"),
                               Y = (decimal) e.Element(gml + "Y") });

        foreach (var c in query)
        {
            Console.WriteLine(c);
        }
    }
}
...