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.Root ではなく doc.Elements() を使用しました。子孫()。
これが更新された作業バージョンです。
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
}
);