XDocument Descendants和Element始终返回空值

时间:2013-01-29 11:22:43

标签: c# windows-phone-7 linq-to-xml windows-phone

嘿,我已经彻底查看了包含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;
    }

3 个答案:

答案 0 :(得分:2)

您可以在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;
}

答案 1 :(得分:1)

1)您必须删除命名空间

2)你必须更准确地查询。 <speaker>中的所有<speakers>元素都有一个全名,但在下一节中我发现了<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").

答案 2 :(得分:1)

您可以省略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