Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析GML文件_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

C# 解析GML文件

C# 解析GML文件,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我遇到了一个问题,我的代码有时只能工作,我希望有更多的专业人士可以检查我做的不对。根据一些阅读,直接作为子代查询标记似乎是获取信息的最简单方法,但我开始意识到这可能不是最好的方法 我的代码: XDocument GMLfile = XDocument.Load(thefile.gml); XNamespace gml = "http://www.opengis.net/gml"; //-------------------------------------------------- var

我遇到了一个问题,我的代码有时只能工作,我希望有更多的专业人士可以检查我做的不对。根据一些阅读,直接作为子代查询标记似乎是获取信息的最简单方法,但我开始意识到这可能不是最好的方法

我的代码:

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>

-102.354210157895448.27850492279583
-100.681369082191348.46080715637999
-100.68704653821987,48.450386310687691 -100.68707054736575,48.450298060122066 -100.68710318142342,48.450211043099841 -100.68714430060783,48.450125632233721
0
500
如果有人愿意定义一种更好的方法来实现这一点,或者详细说明如何在解析XML部分时正确使用LINQ to XML,我将永远感激

亲切问候,, -GeekSmurf

试试这个:

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
               });
以上查询:

x                    y
-102.3542101578954   48.27850492279583 
-100.6813690821913   48.46080715637999 

如果只需要坐标

        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))));
输出:


如果您需要获取任何其他内容,您需要展示如何看起来像一个结论

您到底想从xml文件中获取什么?标记之间的所有数据…@GeekSmurf是GML文件,只需获取第一组逗号分隔的坐标?@Thirisangu我的示例语法只会获取foreach循环中的第一组“坐标”,然后停止,这就是我想说的。我想让它解析所有坐标之间的。。。谢谢你,它帮助我看到了你正在使用的方法,但是我在坐标部分仍然没有任何成功。请注意有两个不同的部分。坐标和坐标。我正在检索坐标部分。福吉,谢谢你花时间写这篇文章。你能帮我理解代码的逻辑吗?我是C#编程的新手,这将极大地帮助我理解这段代码是如何工作的。我还需要通过循环将结果转储到列表框中,因此了解您的操作也会有所帮助。@GeekSmurf书面评论可能会有所帮助:我会写更多的文本,但我的英语很差。如果你告诉我你的表单看起来如何,我会尝试编写你需要的代码
X:-100.68704653821987   Y:48.450386310687691
X:-100.68707054736575   Y:48.450298060122066
X:-100.68710318142342   Y:48.450211043099841
X:-100.68714430060783   Y:48.450125632233721