我正在尝试从 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 中的顶级元素和更深层次的元素。对此的任何帮助也将不胜感激。
更新
正如乔恩的回答所提到的,这主要是在引用各种元素时不使用命名空间的问题。还使用了 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
}
);