2015-04-05 3 views
2

У меня проблема, когда мой код работает только иногда, и я надеюсь, что кто-то с большим опытом может проверить, что я делаю неправильно. Основываясь на некотором чтении, кажется, что запрос тега непосредственно в качестве потомков был самым простым способом получить мою информацию, но я начинаю понимать, что это, возможно, не лучший способ.разбор GML-файла

Мой код:

XDocument GMLfile = XDocument.Load(thefile.gml); 
XNamespace gml = "http://www.opengis.net/gml"; 

//-------------------------------------------------- 
var coordquery = from coords in GMLfile.Descendants(gml + "coordinates") select coords.Value; 

foreach (var coords in coordquery) 
{ 
    listBox1.Items.Add(coords); 
} 

Поведение/проблема:

Это будет правильно проанализировать некоторые файлы и захватить все горизонтально выровненных координатам, но и другие файлы, которые он будет просто захватить первый набор разделенные запятыми координаты и остановка в разделителе пространства.

Пример содержимого GML файла:

<?xml version="1.0" encoding="utf-8" ?> 
<ogr:FeatureCollection 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://ogr.maptools.org/ zprocess.xsd" 
    xmlns:ogr="http://ogr.maptools.org/" 
    xmlns:gml="http://www.opengis.net/gml"> 
    <gml:boundedBy> 
    <gml:Box> 
     <gml:coord><gml:X>-102.3542101578954</gml:X><gml:Y>48.27850492279583</gml:Y></gml:coord> 
     <gml:coord><gml:X>-100.6813690821913</gml:X><gml:Y>48.46080715637999</gml:Y></gml:coord> 
    </gml:Box> 
    </gml:boundedBy> 

    <gml:featureMember> 
    <ogr:Dak fid="F0"> 
     <ogr:geometryProperty><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>-100.68704653821987,48.450386310687691 -100.68707054736575,48.450298060122066 -100.68710318142342,48.450211043099841 -100.68714430060783,48.450125632233721</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></ogr:geometryProperty> 
     <ogr:Id>0</ogr:Id> 
     <ogr:Dist>500.00000000000</ogr:Dist> 
    </ogr:Dak> 
    </gml:featureMember> 
</ogr:FeatureCollection> 

Если кто-то все равно, чтобы определить лучший способ сделать это или разработать о том, как правильно использовать LINQ для XML при анализе разделов с XML, я бы навсегда благодарен !

Уважением, -GeekSmurf

+0

Что именно вы хотите извлечь из XML-файла? –

+0

Все данные между тегами ... GeekSmurf

+0

@GeekSmurf - это файл GML _simply_ захватить первый набор разделенных запятой коордов? –

ответ

1

Попробуйте это:

XNamespace gml = "http://www.opengis.net/gml"; 

var qry = xDoc.Root 
     .Elements(gml + "boundedBy") 
     .Elements(gml + "Box") 
     .Elements(gml + "coord") 
     .Select(a=>new 
       { 
        x=a.Element(gml + "X").Value, 
        y=a.Element(gml + "Y").Value 
       }); 

Над returs запроса:

x     y 
-102.3542101578954 48.27850492279583 
-100.6813690821913 48.46080715637999 
+0

Спасибо за это, это помогло мне увидеть подход, который вы используете, но я до сих пор не добился успеха в разделе «Координаты». Обратите внимание, что есть 2 разных раздела. координаты и ** координаты **. Я пытаюсь получить раздел координат. – GeekSmurf

1

Если вам нужно только координаты:

 XDocument xd = XDocument.Load("5.xml"); 
     XNamespace gml = "http://www.opengis.net/gml"; 

     var xy = xd.Root 
      .Descendants(gml + "coordinates") 
      .Select(y => y.Value.Split(' ').Select(z => z.Split(',')) 
          .Select(z => new { X = z[0], Y = z[1] }).ToArray()) 
      .Single(); 

     Console.WriteLine(string.Join("\n", 
      xy.Select(z => string.Format("X:{0}\tY:{1}\t", z.X, z.Y)))); 

Out:

X:-100.68704653821987 Y:48.450386310687691 
X:-100.68707054736575 Y:48.450298060122066 
X:-100.68710318142342 Y:48.450211043099841 
X:-100.68714430060783 Y:48.450125632233721 

Если вам нужно получить что-нибудь еще, вы должны показать, как выглядит вывод

+0

Туманный, спасибо, что нашли время, чтобы написать это. Не могли бы вы помочь мне понять логику кода? Я очень новичок в программировании на C#, и это очень помогло бы понять, как работает этот код. Мне также нужно сделать дамп результатов в listBox через цикл, поэтому понимание того, что вы сделали, также поможет в этом. – GeekSmurf

+0

@GeekSmurf Письменные комментарии могут помочь: http://pastebin.com/0rTCzjaV Написал бы больше текста, но мой английский очень плохой. Если вы покажете мне, как выглядит ваша форма, я попытался написать код, который вам нужен –