了解Linq To Xml - Descendants没有返回结果

时间:2010-02-25 23:50:07

标签: c# linq-to-xml

我是Linq2XML的新手,因为我编写了许多代码来执行简单的操作,在一个简单的项目中,我想尝试一下......

我和我在一起已经有2个小时了,我没有做到这一点:(

我真的,真的想回到 XmlNode-code-like

任务:

  • 我将SOAP Action发送到ASMX服务,然后以XML格式获取响应
  • 我将XML解析为XDocument对象
  • 我尝试获取节点列表......错误!问题!

从此screenshot

可以看到

alt text http://www.balexandre.com/temp/2010-02-26_0038.png

我的 XDocument 有一个名为 TransactionInformationType 的节点,这是一个序列,我很简单想要获取所有并且只检索我需要的2个变量(你可以看到代码注释)正好在选择c;

之下

观看窗口中,您可以看到

doc.Descendants("TransactionInformationType")

根本不返回任何内容,并且通过Text Visualizer中的XDocument内容查看它确实存在!

有人愿意解释并帮助我通过这个巨大的墙吗?

谢谢!


  

XDocument content


答案

Response XML有

  

<gettransactionlistResponse xmlns="https://ssl.ditonlinebetalingssystem.dk/remote/payment">

我必须使用它作为命名空间!

证明,要检索值,我确实需要使用XNamespace ,因此最终代码如下所示:

// Parse XML
XDocument doc = XDocument.Parse(strResponse);
XNamespace ns = "https://ssl.ditonlinebetalingssystem.dk/remote/payment";

var trans = from item in doc.Descendants(ns + "TransactionInformationType")
            select new TransactionInformationType
            {
                capturedamount = Convert.ToInt32(item.Element(ns + "capturedamount").Value),
                orderid = item.Element(ns + "cardtypeid").Value
            };

谢谢大家的帮助!

2 个答案:

答案 0 :(得分:48)

var result = doc.Descendants("TransactionInformationType");

选择XDocument中具有元素名称"TransactionInformationType"且位于空命名空间中的所有后代。 从您的屏幕截图来看,您尝试选择的元素似乎位于命名空间"https://ssl.ditonlinebetalingssystem.dk/remote/payment"中。 您需要明确指定:

XNamespace ns = "https://ssl.ditonlinebetalingssystem.dk/remote/payment";
                                              ↑↑                      ↑
var result = doc.Descendants(ns + "TransactionInformationType");

答案 1 :(得分:12)

这应该解决你的问题(用正确的URL替换命名空间):

XNamespace ns = "https://ssl.ditonline...";
doc.Descendants(ns + "TransactionInformationType");