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

bal*_*dre 41 c# linq-to-xml

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

我和他一起工作了2个小时,我没有做到这一点:(

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

任务:

  • 我将SOAP Action发送到ASMX服务,然后将响应作为XML获取
  • 我将XML解析为XDocument对象
  • 我试着得到一个节点列表......错!问题!

正如你从这个截图中看到的那样

替代文字http://www.balexandre.com/temp/2010-02-26_0038.png

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

Watch窗口中,您可以看到

doc.Descendants("TransactionInformationType")
Run Code Online (Sandbox Code Playgroud)

什么都不返回,并且通过Text Visualizer中的XDocument的内容看,它确实存在!

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

谢谢!


添加

XDocument内容


回答

响应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
            };
Run Code Online (Sandbox Code Playgroud)

谢谢大家的帮助!

dtb*_*dtb 48

var result = doc.Descendants("TransactionInformationType");
Run Code Online (Sandbox Code Playgroud)

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

XNamespace ns = "https://ssl.ditonlinebetalingssystem.dk/remote/payment";
                                              ??                      ?
var result = doc.Descendants(ns + "TransactionInformationType");
Run Code Online (Sandbox Code Playgroud)


Axe*_*ger 12

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

XNamespace ns = "https://ssl.ditonline...";
doc.Descendants(ns + "TransactionInformationType");
Run Code Online (Sandbox Code Playgroud)