Как выбрать конкретные элементы с конкретными атрибутами при разборе файла gml в C #? - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь разобрать файл gml в C #.Вот почему мне нужно выбрать некоторые конкретные элементы на нем.Я пытаюсь выбрать координаты, расположенные в <lifr:LineString gml:id="ls1">

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

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:gml ="http://www.opengis.net/gml/3.2" xmlns:lifr="http://www.opengis.net/infragml/road/1.0" xmlns:xlink="http://www.opengis.net/infragml/road/1.0">
 <lifr:stringLineSet>
  <lifr:StringLineSet gml:id="sls1">
    <gml:description>string lines delineating the top pavement surface</gml:description>
    <gml:name>top surface pavement</gml:name>
    <lifr:stringLineSetID>
      <lifr:ID>
        <identifier>pavement1</identifier>
      </lifr:ID>
    </lifr:stringLineSetID>
    <lifr:stringLine>
      <lifr:StringLine gml:id="sl1">
        <gml:description>top surface</gml:description>
        <gml:name>left edge pavement</gml:name>
        <lifr:stringLineID>
          <lifr:ID>
            <identifier>LEP</identifier>
          </lifr:ID>
        </lifr:stringLineID>
        <lifr:geometry>
          <lifr:LineString gml:id="ls1">
            <gml:pos>-3.650 1000 49.927</gml:pos>
            <gml:pos>-3.650 1100 48.927</gml:pos>
          </lifr:LineString>
        </lifr:geometry>
      </lifr:StringLine>
    </lifr:stringLine>
    <lifr:stringLine>
      <lifr:StringLine gml:id="sl2">
        <gml:description>top surface</gml:description>
        <gml:name>centerline pavement</gml:name>
        <lifr:stringLineID>
          <lifr:ID>
            <identifier>CLP</identifier>
          </lifr:ID>
        </lifr:stringLineID>
        <lifr:geometry>
          <lifr:LineString gml:id="ls2">
            <gml:pos>0.000 1000 50.000</gml:pos>
            <gml:pos>0.000 1100 49.000</gml:pos>
          </lifr:LineString>
        </lifr:geometry>
        <lifr:alternativeGeometry xlink:href="ac1"/>
      </lifr:StringLine>
    </lifr:stringLine>
    <lifr:stringLine>
      <lifr:StringLine gml:id="sl3">
        <gml:description>top surface</gml:description>
        <gml:name>right edge pavement</gml:name>
        <lifr:stringLineID>
          <lifr:ID>
            <identifier>REP</identifier>
          </lifr:ID>
        </lifr:stringLineID>
        <lifr:geometry>
          <lifr:LineString gml:id="ls3">
            <gml:pos>3.650 1000 49.927</gml:pos>
            <gml:pos>3.650 1100 48.927</gml:pos>
          </lifr:LineString>
        </lifr:geometry>
      </lifr:StringLine>
    </lifr:stringLine>
  </lifr:StringLineSet>
</lifr:stringLineSet>
</root>

Я пытался записать координаты в консоли с помощьюкод ниже, но я только что получил пустую консоль.

        XNamespace gml = "http://www.opengis.net/gml/3.2";
        XNamespace lifr = "http://www.opengis.net/infragml/road/1.0";
        XDocument xmlDoc = XDocument.Load(@"C:\Road_example.gml"); 

        IEnumerable<XElement> pavement = 
            from el in xmlDoc.Elements().Elements(lifr + "LineString")
            where (string)el.Attribute(gml + "id") == "ls1"
            select xmlDoc.Parent.Element(gml + "pos");
        foreach (XElement coords in pavement)

        Console.WriteLine(coords);
        Console.ReadKey();

1 Ответ

0 голосов
/ 26 октября 2018

Вот решение:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication75
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XNamespace gml = "http://www.opengis.net/gml/3.2";
            XNamespace lifr = "http://www.opengis.net/infragml/road/1.0";
            XDocument xmlDoc = XDocument.Load(FILENAME);

            List<XElement> pavement = xmlDoc.Descendants(lifr + "LineString").ToList();

            foreach (XElement coords in pavement)
            {
                string id = (string)coords.Attribute(gml + "id");
                string pos = string.Join(",", coords.Elements(gml + "pos").Select(x => (string)x));

                Console.WriteLine("id = '{0}', positions = '{1}'", id, pos);

            }

            //with filtered results
            var ls1 = pavement.Where(x => (string)x.Attribute(gml + "id") == "ls1").FirstOrDefault();
            string positions = string.Join(",", ls1.Elements(gml + "pos").Select(x => (string)x));


            Console.ReadKey();
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...