使用LINQ从XML文件中选择元素

4

我有这个XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>My Work</name>
    <Placemark>
      <name>Main Building</name>
      <Polygon>
        <extrude>1</extrude>
        <altitudeMode>relativeToGround</altitudeMode>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>

    <Placemark>
      <name>Office 1</name>
      <Polygon>
        <extrude>1</extrude>
        <altitudeMode>relativeToGround</altitudeMode>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>
  </Document>
</kml>

继续阅读...

我需要为每个建筑物选择“名称”,并将其存储在列表中。我已编写了以下代码:

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

namespace dsdsdsds
{
    public class Building
    {
        public string BuildingName { get; set; }
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            List<Building> buildingNames = 
                (from e in XDocument.Load("buildings.kml").Root
                                    .Elements("Document")
                 select new Building
                 {
                     BuildingName = (string)e.Element("name")
                 }).ToList();

            foreach (var e in buildingNames)
            {
                Console.WriteLine(e);
            }
        }
    }
}

然而,它似乎不想输出任何内容,我无法找出我的错误在哪里。有人能帮助我吗?
谢谢。
3个回答

6

你忘记在你的xml中声明了命名空间:

var xdoc = XDocument.Load("buildings.kml");
XNamespace kml = "http://www.opengis.net/kml/2.2";
var buildings = xdoc.Root.Elements(kml + "Document")
                    .Select(d => new Building {
                        BuildingName = (string)d.Element(kml + "name")
                    }).ToList();

谢谢回复。当我执行“foreach (var b in buildings) { Console.WriteLine (b); }”时,我只得到了:dsdsdsds.Building ?? - Phorce
1
你应该将 b.BuildingName 写入控制台。顺便问一下,你确定你的建筑是一个 Document 元素吗?也许你需要 Placemark - Sergey Berezovskiy
1
你刚刚让我的一天变得更美好了。我对此感激不尽 :)!非常感谢你哈!祝你有一个愉快的白天/晚上/夜晚。 - Phorce

2
XDocument xDocument = XDocument.Load("buildings.kml");
XNamespace xNameSpace = "http://www.opengis.net/kml/2.2";

var names = from o in xDocument.Descendants(xNameSpace+"name")
            select o.Value;

我认为这是最简单的方法;不要忘记在查询的元素之前添加命名空间。


1

从我的观察来看,您正在尝试循环遍历“文档”元素并选择它们的名称。相反,您可能希望进一步前进一步,进入Placemark元素。

XDocument.Load("buildings.kml").Element("Document").Elements("Placemark")
                    select new Building
                    {
                        BuildingName = e.Element("name").Value
                    }).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接