Возникли проблемы с разбором xml с linq в xml - PullRequest
1 голос
/ 07 ноября 2011

У меня проблема с синтаксическим анализом 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 };

Есть ли решение или способ его проанализировать?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

У вас есть пара проблем: во-первых, узел Result не является потомком.Это корень.Во-вторых, вы столкнулись с наиболее распространенной проблемой при использовании 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;
1 голос
/ 07 ноября 2011

Этот метод позволяет избежать проблемы с пространством имен, используя LocalName (неквалифицированный идентификатор).

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