停留在基本的 Linq to XML 查询上

2024-01-23

我正在尝试从 namecheap 沙箱 api 中提取信息,但无法弄清楚为什么我的 linq 查询不起作用。

这是一个示例响应。

XML

<ApiResponse Status="OK" xmlns="http://api.namecheap.com/xml.response">
  <Errors />
  <Warnings />
  <RequestedCommand>namecheap.domains.check</RequestedCommand>
  <CommandResponse>
    <DomainCheckResult Domain="google.com" Available="false" />
  </CommandResponse>
  <Server>WEB1-SANDBOX1</Server>
  <GMTTimeDifference>--4:00</GMTTimeDifference>
  <ExecutionTime>0.875</ExecutionTime>
</ApiResponse>

C#

var doc = XDocument.Load(url);
var response = (
    from  r in doc.Root.Descendants("ApiResponse") 
    where 1==1
    select new  { 
        Errors = r.Element("Errors").Value,
        Warnings = r.Element("Warnings").Value,
        RequestedCommand = r.Element("RequestedCommand").Value,
        CommandResponse = r.Element("CommandResponse").Value,
        Server = r.Element("Server").Value
    }
);

我还使用同一个文档尝试了此查询,只是为了看看一个简单的示例是否有效。

var test = doc.Descendants("RequestedCommand").First().Value;

但两者都返回 null。那么我哪里出错了?我最终需要了解 CommandResponse 中的顶层元素和更深层次的元素。任何有关这方面的帮助也将不胜感激。

UPDATE

正如乔恩的回答所提到的,这主要是在引用各种元素时不使用名称空间的问题。还使用 doc.Elements() 而不是 doc.Root。后人()。

这是更新的工作版本。

XNamespace ns = "http://api.namecheap.com/xml.response";
var response = (
    from r in doc.Elements()
    select new
    {
        Errors = r.Element(ns + "Errors").Value,
        Warnings = r.Element(ns + "Warnings").Value,
        RequestedCommand = r.Element(ns + "RequestedCommand").Value,
        CommandResponse = r.Element(ns + "CommandResponse").Value,
        Server = r.Element(ns + "Server").Value
    }
);

问题是,当您查找元素、后代等时,您没有使用名称空间:

XNamespace ns = "http://api.namecheap.com/xml.response";
var doc = XDocument.Load(url);
var response = doc.Root
                  .Descendants(ns + "ApiResponse")
                  .Select(r => new {
                              Errors = r.Element(ns + "Errors").Value,
                              ...
                          });

(请注意,你永远不需要where 1 == 1在 LINQ 中...我已经从查询表达式语法中更改了它,因为它没有给你任何东西。)

命名空间继承自<ApiResponse>element 作为所有其他元素的默认命名空间,因为它只是xmlns=...而不是指定别名。

另请注意,如果您向我们展示了wholeXML 文档,那么上面将找不到您所要求的任何元素ApiReponse元素below根元素,而它is根元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

停留在基本的 Linq to XML 查询上 的相关文章

随机推荐