【问题标题】:Understanding Linq To Xml - Descendants return no results了解 Linq To Xml - 后代不返回任何结果
【发布时间】:2011-01-21 06:20:19
【问题描述】:

我对 Linq2XML 完全陌生,因为我编写了很多行代码来执行简单的事情,并且在一个简单的项目中我想尝试一下...

我用了 2 个小时,但我没有做对:(

我真的非常想回到 XmlNode-code-alike

任务:

  • 我向 ASMX 服务发送了一个 SOAP 操作,我得到了 XML 格式的响应
  • 我将 XML 解析为 XDocument 对象
  • 我尝试获取节点列表...错误!问题!

你可以从这个screenshot看到

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

我的 XDocument 有一个名为 TransactionInformationType 的节点,女巫是一个序列,我只想获取所有并检索我需要的唯一 2 个变量(你可以看到代码注释)就在select c;

下面

观看窗口中,您可以看到

doc.Descendants("TransactionInformationType")

什么都不返回,从 Text Visualizer 中 XDocument 的内容来看,它确实存在!

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

谢谢!


已添加

XDocument content


回答

响应 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
            };

谢谢大家的帮助!

【问题讨论】:

  • 您能否将 XML 的标头发布到您要查找的元素。这里可能存在命名空间问题。
  • 完成!将它添加到 pasteBin,因为它很大(即使我只显示 2 个事务):)

标签: c# linq-to-xml


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    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");
    

    【讨论】:

    • 刚刚在我的答案中添加了 XDocument 内容。如果我使用 "https://ssl.ditonlinebetalingsystem.dk/remote/payment/" 作为 XNamespace,我会得到相同的行为......换句话说,仍然没有:(
    • @balexandre:在您的示例中payment 之后没有/,并且缺少s。确保您在 C# 中使用与 XML 示例中完全相同的命名空间。
    • 有无,结果都一样):balexandre.com/temp/2010-02-26_0136.png
    • 刚刚写了一个简单的示例,似乎有效。 pastebin.org/97518 如果没有,那你的结果一定是不同的。
    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多