XDocument.Descendants (itemName) - Проблемы с поиском подходящего имени - PullRequest
3 голосов
/ 13 октября 2010

Я пытаюсь прочитать XML-RSS-ленту с веб-сайта. Поэтому я использую асинхронную загрузку и создаю XDocument с методом XDocument.Parse().

Документ намеревается быть очень простым, как это:

<root>
  <someAttribute></SomeAttribute>
  <item>...</item>
  <item>...</item>
</root>

Теперь я хочу зачитать все пункты. Поэтому я попытался:

foreach (XElement NewsEntry in xDocument.Descendants("item"))

но это не работает. Итак, я нашел сообщение на этой доске, чтобы использовать полное имя, потому что в корневом элементе определены некоторые пространства имен:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns="http://purl.org/rss/1.0/">

хорошо, я перепробовал все 3 доступных пространства имен - у меня ничего не получалось:

XName itemName = XName.Get("item", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
XName itemName2 = XName.Get("item", "http://purl.org/dc/elements/1.1/");
XName itemName3 = XName.Get("item", "http://purl.org/rss/1.0/modules/syndication/");

Любая помощь будет оценена. (Обычно я делаю XML-анализ с помощью Regex - но на этот раз я разрабатываю для мобильного устройства, и поэтому мне нужно заботиться о производительности.)

Ответы [ 3 ]

4 голосов
/ 13 октября 2010

Вы не пробовали пространство имен по умолчанию в конце объявления rdf:

xmlns="http://purl.org/rss/1.0/"

Это имеет смысл, поскольку любому элементу в пространстве имен по умолчанию не нужно, чтобы пространство имен было добавлено к имени элемента.

2 голосов
/ 13 октября 2010

Не является прямым решением проблемы чтения XDocument RSS. Но почему вы не используете предоставленный класс SyncdicationFeed для загрузки канала? http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx

0 голосов
/ 13 октября 2010

Попробуйте это

var elements = from p in xDocument.Root.Elements()
where p.Name.LocalName == "item"
select p;

foreach(var element in elements)
{
//Do stuff
}
...