XDocument 后代和元素始终返回空值
本文关键字:返回 空值 元素 后代 XDocument | 更新日期: 2023-09-27 17:56:41
嘿,我已经彻底查看了所有包含XDocument
的问题,虽然它们都给出了我正在寻找的答案(主要是命名空间问题),但它似乎对我不起作用。
遇到的问题是我无法选择任何值,无论是属性还是元素。
使用此 XML
我正在尝试检索说话者的全名。
public void GetEvent()
{
var xdocument = XDocument.Load(@"Shared'techdays2013.xml");
XNamespace xmlns = "http://www.w3.org/2001/XMLSchema-instance";
var data = from c in xdocument.Descendants(xmlns + "speaker")
select c.Element(xmlns + "fullname").Value;
}
可以在 linq 语句中省略命名空间声明。
public void GetEvent()
{
var xdocument = XDocument.Load(@"Shared'techdays2013.xml");
//XNamespace xmlns = "http://www.w3.org/2001/XMLSchema-instance";
var data = from c in xdocument.Descendants("speaker")
select c.Element("fullname").Value;
}
您可以省略WebClient
,因为您可以直接本地访问文件。我只是在展示一种在我的机器上处理您的文件的方法。
void Main()
{
string p = @"http://events.feed.comportal.be/agenda.aspx?event=TechDays&year=2013&speakerlist=c%7CExperts";
using (var client = new WebClient())
{
string str = client.DownloadString(p);
var xml = XDocument.Parse(str);
var result = xml.Descendants("speaker")
.Select(speaker => GetNameOrDefault(speaker));
//LinqPad specific call
result.Dump();
}
}
public static string GetNameOrDefault(XElement element)
{
var name = element.Element("fullname");
return name != null ? name.Value : "no name";
}
指纹:
Bart De Smet
Daniel Pearson
Scott Schnoll
Ilse Van Criekinge
John Craddock
Corey Hynes
Bryon Surace
Jeff Prosise
1)你必须删除命名空间
2)您必须更精确地查询。<speakers>
中的所有<speaker>
元素都有一个全名,但在下一节中我发现了<speaker id="94" />
一个简单的修复(也许不是最好的):
//untested
var data = from c in xdocument.Root.Descendants("speakers").Descendants("speaker")
select c.Element("fullname").Value;
您可能希望更精确地指定路径:
xdocument.Element("details").Element("tracks").Element("speakers").