2011-11-07 62 views
1

我遇到解析從Web Service接收到的xml的問題。解決xml與linq到xml的問題

的XML看起來很簡單:

<Result xsi:schemaLocation="urn:yahoo:developer http://developer.yahooapis.com/TimeService/V1/GetTimeResponse.xsd" type="web"><Timestamp>1320677359</Timestamp></Result> 

但是,當我嘗試用下面的代碼我越來越沒有返回結果,解析它。

XDocument doc = XDocument.Load("http://developer.yahooapis.com/TimeService/V1/getTime?appid=StackSolution");   

      var datestamp = from ds in doc.Descendants("Result") 
          select new { currentstamp = ds.Element("Timestamp").Value }; 

有沒有解決方法或解析它的方法?

感謝您提前

+0

不用那麼多,你可以包含一個XML樣例嗎? –

+0

是的,在原始郵件中,包裝在代碼標籤中的第一行是實際的XML。 – Dmitris

+0

哦,廢話,我應該滾動:-) –

回答

3

你有幾個問題:第一,結果節點不是後代。這是根。其次,在使用LINQ to XML時遇到了最常見的問題 - 您忘記了命名空間。下面應該給你你需要的東西:

XElement doc = XElement.Load("http://developer.yahooapis.com/TimeService/V1/getTime?appid=StackSolution");    
XNamespace ns = "urn:yahoo:developer"; 
var datestamp = from ds in doc.DescendantsAndSelf(ns + "Result") 
       select new { currentstamp = ds.Element(ns + "Timestamp").Value }; 

注意,這會產生一個IEnumerable。如果您只需要日期戳記,請考慮使用FirstOrDefault。您可以通過只是在做以下,使這個簡單的:

XElement doc = XElement.Load("http://developer.yahooapis.com/TimeService/V1/getTime?appid=StackSolution");    
XNamespace ns = "urn:yahoo:developer"; 
var datestamp = doc.Element(ns + "Timestamp").Value; 
+0

工作就像一個魅力,正是我需要的。非常感謝! – Dmitris

1

這種方法避免了使用LocalName(不合格標識符)的命名空間的問題。

var datestamp = doc.Root.Descendants().Where(c => c.Name.LocalName.Equals("Timestamp")).FirstOrDefault().FirstNode.ToString()