2012-05-31 83 views
2

我想從namecheap沙箱api中提取信息,並找不到爲什麼我的linq查詢不工作。卡在基本的Linq到XML查詢

下面是一個示例回覆。

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 
    } 
); 

回答

5

的問題是,你不使用,當你正在尋找元素的名稱空間,後代等:

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, 
           ... 
          }); 

(請注意,您再也不需要在LINQ where 1 == 1 ...我已將它從查詢表達式語法改爲它沒有給你任何東西)。

命名空間從<ApiResponse>元素作爲所有其他元素的默認命名空間繼承,因爲它只是xmlns=...而不是指定別名。

還要注意的是,如果你已經證明我們的整個 XML文檔,那麼上面不會找到任何元素,你問ApiReponse元素下面根元素,而它根元素。

+0

自認爲是整個文檔,應該用什麼來代替。後人? – Jerry

+1

有沒有辦法爲所有的XDocument設置一個通用的命名空間,而不是在每個方法調用中使用它? – themarcuz

+0

我也想得到一個迴應,因爲我看到的許多例子從來沒有參考命名空間,所以我不認爲它們是必需的。 – Jerry

0

我剛剛Skeeted;)

這裏的東西我在linqpad沒有得到你的元素之一,在XML

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

<GMTTimeDifference>--4:00</GMTTimeDifference> 
<ExecutionTime>0.875</ExecutionTime> 
</ApiResponse>"; 

//myxml.Dump(); 

XNamespace p = "http://api.namecheap.com/xml.response"; 
var doc1 = XElement.Parse(myxml); 
var x = from n in doc1.Elements(p + "Server") select n; 
x.First().Value.Dump();