Результат синтаксического анализа из службы WCF webHttp

#wcf #linq-to-xml

#wcf #linq-to-xml

Вопрос:

У меня запущена очень простая служба WCF, которая возвращает следующий (из базового нового проекта) xml:

   <ArrayOfSampleItem xmlns="http://schemas.datacontract.org/2004/07/WcfRestService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
     <SampleItem>
         <Id>1</Id>
         <StringValue>Hello</StringValue>
     </SampleItem>
  </ArrayOfSampleItem>
  

Затем я использую это в приложении для Windows Phone 7. Результат возвращается нормально, однако у меня возникают проблемы с синтаксическим анализом xml. Это код, который я использую при обратном вызове после завершения запроса:

         XDocument xmlDoc = XDocument.Parse(e.Result);

        itemsFetched.ItemsSource = from item in xmlDoc.Descendants("SampleItem")
                                   select new Product()
                                              {
                                                  Id = item.Element("Id").Value,
                                                  StringValue = item.Element("StringValue").Value
                                              };
  

Коллекция не заполняется этим, когда я пытаюсь добавить пространство имен:

         XNamespace web = "http://schemas.datacontract.org/2004/07/WcfRestService1";

        XDocument xmlDoc = XDocument.Parse(e.Result);

        itemsFetched.ItemsSource = from item in xmlDoc.Descendants(web   "SampleItem")
  

Элемент найден, но я получаю исключение null при попытке получить значение Id.

Любая помощь была бы высоко оценена.

Ответ №1:

Что ж, xmlns="..." помещает элементы и всех их потомков в пространство имен, поэтому вам нужно использовать свой XNamespace объект web везде, где вы получаете доступ к элементам:

 XDocument xmlDoc = XDocument.Parse(e.Result);
XNamespace web = "http://schemas.datacontract.org/2004/07/WcfRestService1";

itemsFetched.ItemsSource = from item in xmlDoc.Descendants(web   "SampleItem")
                           select new Product()
                                              {
                                                  Id = item.Element(web   "Id").Value,
                                                  StringValue = item.Element(web   "StringValue").Value
                                              };
  

Комментарии:

1. Большое тебе спасибо, Мартин, обычно я, должно быть, пробовал все, кроме этого!