2015-04-05 93 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); 
} 

的行为/问题:

它将正确解析一些文件,抓住所有的水平对齐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> 

如果有人会关心定义一个更好的方式来做到这一点或阐述如何解析XML的章节时正确地使用LINQ到XML,我将永远感激!

亲切的问候, -GeekSmurf

+0

你想从XML文件获取究竟是什么? – 2015-04-05 21:29:20

+0

标签之间的所有数据 ... GeekSmurf 2015-04-05 21:33:35

+0

@GeekSmurf是GML文件_simply_抓住第一组逗号分隔的坐标吗? – 2015-04-06 06:44:56

回答

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 2015-04-05 22:14:12

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)))); 

日期:

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#编程的新手,这将非常有助于理解代码如何工作。我还需要通过循环将结果转储到列表框,所以理解你所做的也会对此有所帮助。 – GeekSmurf 2015-04-07 00:01:14

+0

@GeekSmurf书面评论可能会有所帮助:http://pastebin.com/0rTCzjaV会写更多的文字,但我的英语非常糟糕。如果您向我展示了您的表单外观,我试图编写您需要的代码 – 2015-04-07 11:55:45