Синтаксический анализ XML-данных с помощью XDocument / XElement

#xml #linq-to-xml #xelement

#xml #linq-to-xml #xelement

Вопрос:

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

<content:encoded>THIS IS FULL OF HTML
</content:encoded>

Это строка XML, которую, похоже, он не анализирует. Это также единственный файл с двоеточием и единственный, который содержит HTML-данные. Остальные выглядят следующим образом.

 <title>
An amazing Title
</title>
<link>
More Junk
</link>
<comments>
Comments and things
</comments>
  

Ниже приведен мой код, который отлично обрабатывает все остальные элементы. Есть идеи?

 allPosts = (from x in feed.Descendants("item")
                         select new blogPost
                         {
                             Creator = (string)x.Element("creator"),
                             Title = (string)x.Element("title"),
                             Published = DateTime.Parse((string)x.Element("pubDate")),
                             Content = (string)x.Element("content"),
                             Description = (string)x.Element("description"),
                             Link = (string)x.Element("link"),
                         }).ToList<blogPost>();
  

Спасибо

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

1. Можете ли вы указать нам на RSS-канал? Кроме того, вы можете захотеть запустить его через средство проверки RSS, например: rssboard.org/rss-validator

Ответ №1:

Похоже, вы ищете контент, а не закодированный. Содержимое — это пространство имен XML, связанное с закодированным элементом. Что вам нужно, так это определить для него правильное пространство имен и добавить его в свой запрос:

 XNamespace contentNS = "<whatever the namespace is>";

allPosts = (from x in feed.Descendants("item")
                         select new blogPost
                         {
                             Creator = (string)x.Element("creator"),
                             Title = (string)x.Element("title"),
                             Published = DateTime.Parse((string)x.Element("pubDate")),

                             // Looking for content:encoded
                             Content = (string)x.Element(contentNS   "encoded"),

                             Description = (string)x.Element("description"),
                             Link = (string)x.Element("link"),
                         }).ToList<blogPost>();
  

Значение contentNS зависит от того, что присутствует в вашем исходном XML, попробуйте поискать определение xmlns: content в корневом элементе.

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

1. Я понял это. Проблема, с которой я столкнулся, заключалась в том, что нигде в файле не было определения xmlns: content. В конце концов я нашел это, просмотрев некоторые документы RSS в Интернете. Почему это не включено в файл, я не уверен.