#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. Большое тебе спасибо, Мартин, обычно я, должно быть, пробовал все, кроме этого!