Анализ XML-потока с использованием LINQ

99
6

Я нашел много примеров и вопросов по этой теме, но то, что когда-либо пытаюсь получить результат, пусто.

Из xml мне нужно выйти из первого элемента 'listing' отсюда мне нужно только имя DisplayName и Address.

sample image

var listings = from c in xdoc.Elements("listing") select c;

спросил(а) 2012-05-22T18:00:00+04:00 8 лет, 5 месяцев назад
1
Решение
81

Вам не хватает пространства имен в запросе. Имя узла не listing это пространство имен + listing

Поэтому вам нужно получить пространство имен элемента wp или использовать свойство локального имени:

var listings  = from c in xdoc.Descendants()
where c.Name.LocalName == "listing"
select c;

или вам нужно получить пространство имен и добавить его в запрос

XNamespace ns = // namespace name here
var listings = from c in xdoc.Descendants(ns + "listing") select c;

listing будет определен как некоторый вариант IEnumerable<XElement>. Точный тип будет варьироваться в зависимости от того, какой запрос вы использовали, но важная часть будет получена из IEnumerable<>.

Другая проблема заключается в использовании метода Elements(). Elements() будут искать только узлы узла, определенные xdoc. Descendants() также будут смотреть в дочерний элемент дочерних элементов и всех других дочерних узлов.

UPDATE 1 - добавлена дополнительная информация о получении определенных узлов из XML

Получение адреса и отображаемого имени в основном является одним и тем же процессом, на самом деле вы можете просто добавить его в исходный запрос или использовать другой запрос (все зависит от того, как вы хотите использовать его позже - вам понадобятся другие элементы wp:listing или просто displayname и address?

Если вам могут понадобиться другие, то логично сделать это как другой запрос, чтобы вы могли позже запросить свой результат. Читаемость также вступает в игру, так как вложенность нескольких запросов внутри друг друга может затруднить чтение на мой взгляд.

Получение адреса - самая сложная часть. Вам нужно решить, как вы хотите... вы хотите, чтобы XElement со всеми XElement частями в качестве дочерних узлов? Или вы хотите построить новый объект? Или вам нужна конкатенированная строка?

Но общий запрос будет примерно таким:

var result = from listing in listings
select new
{
Name = listing.Element(ns + "displayname").Value,
Address = listing.Element(ns + "address")
};

Это даст вам IEnumerable<'a'> с определен как анонимный тип, состоящий из свойства Name (как строка) и собственность Адрес (как XElement). a Если вы хотите что-то еще, вам нужно заменить Address = listing.Element(ns + "address") на соответствующую строку (строки) кода.

Если вам нужен еще один анонимный тип, тогда вам нужно поместить вложенный запрос в эту строку:

Address = from part in listing.Elements(ns + "address")
select new
{
FullStreet = part.Element(ns + "fullstreet").Value,
HouseNumber = part.Element(ns + "house").Value,
Street = part.Element(ns + "street").Value,
StreetType = part.Element(ns + "streettype").Value,
// continue for all Elements you need/want
};

Или вы можете просто создать класс Address и вызвать конструктор или фабричный метод в запросе и передать XElement или части адреса.

ответил(а) 2012-05-22T18:08:00+04:00 8 лет, 5 месяцев назад
41

Попытайтесь использовать Descendants вместо Elements


 var listings = from c in xdoc.Descendants("listing") select c;

ответил(а) 2012-05-22T18:11:00+04:00 8 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема