C# 使用LINQ从XML文件中选择元素
我有以下XML结构:C# 使用LINQ从XML文件中选择元素,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我有以下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>
<?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>
我的作品
主楼
1.
相对地
办公室1
1.
相对地
这样下去
我需要为它们中的每一个选择建筑“名称”,并将其存储在列表中。我编写了以下代码:
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);
}
}
}
}
使用系统;
使用System.Linq;
使用System.Xml;
使用System.Xml.Linq;
使用System.Collections.Generic;
名称空间DSD
{
公共班级大楼
{
公共字符串BuildingName{get;set;}
}
类主类
{
公共静态void Main(字符串[]args)
{
列表构建名称=
(从XDocument.Load(“buildings.kml”)中的e开始)根
.要素(“文件”)
选择新建筑
{
BuildingName=(字符串)e.Element(“名称”)
}).ToList();
foreach(buildingNames中的变量e)
{
控制台写入线(e);
}
}
}
}
然而,它似乎不想输出任何东西,我无法找出哪里出了问题。有人能帮我吗
谢谢据我所见,您正在尝试循环“文档”元素并选择它们的名称。相反,您可能想更进一步,进入Placemark元素,即
XDocument.Load("buildings.kml").Element("Document").Elements("Placemark")
select new Building
{
BuildingName = e.Element("name").Value
}).ToList();
您忘记了在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){Console.WriteLine(b);}我得到的只是:dsds.Building??你应该把
b.BuildingName
写到控制台上。顺便问一下,你确定你的建筑是文档
元素吗?也许你需要Placemark
?你真的让我高兴了一天。我真的非常感谢你:)!但是谢谢你哈!祝你有一个愉快的一天/晚上/晚上
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;