使用 GML/C#/LINQ 将各种 xml 元素组合到一个集合中

Combining various xml elements into one collection using GML/C#/LINQ

我正在尝试用 C# 读取 GML 文件。我想将所有 returned 数据存储在一个对象中。到目前为止,我已经能够 return 所有数据,但在 3 个单独的对象中:

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

// Points
var points = doc.Descendants(gml + "Point")
              .Select(e => new
              {
                POSLIST = (string)e.Element(gml + "pos")
              });

// LineString
var lineStrings = doc.Descendants(gml + "LineString")
                  .Select(e => new
                  {
                      POSLIST = (string)e.Element(gml + "posList")
                  });

// Polygon
var polygons = doc.Descendants(gml + "LinearRing")
               .Select(e => new
               {
                   POSLIST = (string)e.Element(gml + "posList")
               });

我想创建一个对象,而不是创建 3 个单独的对象,如下所示:

var all = doc.Descendants(gml + "Point")
          doc.Descendants(gml + "LineString")
          doc.Descendants(gml + "LinearRing")....

但需要一些帮助。在此先致谢。

示例数据:

<gml:Point>
<gml:pos>1 2 3</gml:pos>
</gml:Point>
<gml:LineString>
<gml:posList>1 2 3</gml:posList>
</gml:LineString>
<gml:LinearRing>
<gml:posList>1 2 3</gml:posList>
</gml:LinearRing>

您可以使用 Concat:

XDocument doc = XDocument.Load(fileName);
XNamespace gml = "http://www.opengis.net/gml";
var all = doc.Descendants(gml + "Point")
             .Concat(doc.Descendants(gml + "LineString"))
             .Concat(doc.Descendants(gml + "LinearRing"));

要获取值作为内部元素,您可以这样做:

XDocument doc = XDocument.Load("data.xml");
XNamespace gml = "http://www.opengis.net/gml";
var all = doc.Descendants(gml + "Point")
             .Select(e => new { Type = e.Name, Value = (string)e.Element(gml + "pos") })
             .Concat(doc.Descendants(gml + "LineString")
                        .Select(e => new { Type = e.Name, Value = (string)e.Element(gml + "posList") }))
             .Concat(doc.Descendants(gml + "LinearRing")
                        .Select(e => new { Type = e.Name, Value = (string)e.Element(gml + "posList") }));