2013-12-12 4 views
1

Это образец XML из элемента каналаКак разобрать XML ссылка тег HREF атрибута с помощью C#

<item> 
    <pubDate>2013-12-11 10:28:55</pubDate> 
    <title> 
    SAG Awards Nominations: 12 Years a Slave, Breaking Bad lead the race 
    </title> 
    <link> 
    http://www.rottentomatoes.com/m/1929182/news/1929182/ 
    </link> 
    <description> 
    <![CDATA[ ]]> 
    </description> 
    <atom:link rel="thumbnail" type="image/*" href="http://content6.flixster.com/movie/11/17/36/11173600_tmb.jpg"/> 
    </item> 

C# код для синтаксического анализа XML-элементов

List<XElement> elementsList = xmlItems.Descendants("item").ToList(); 
foreach (XElement rssItem in elementsList) 
{ 
    RSSItem rss = new RSSItem(); 
    rss.Description1 = rssItem.Element("description").Value; 
    rss.Link1 = rssItem.Element("link").Value; 
    rss.Title1 = rssItem.Element("title").Value; 
    rss.ImageUrl= ; 
} 

Я успешно проанализирован xml, за исключением тега atom:link.
Как мы можем проанализировать свойство href из тега atom:link?

ответ

1

Ссылка имеет пространство имен, вам нужно указать его при разборе XML. Я не помню точно, что такое пространство имен atom, но оно должно указываться где-то в файле XML (обычно на корневом узле). Например, если он:

<feed xmlns:atom="http://www.w3.org/2005/Atom"> 

Затем вам нужно разобрать его, как это:

rss.Link1 = (string)rssItem.Element(XName.Get("link", "http://www.w3.org/2005/Atom")).Attribute("href"); 
+0

Спасибо за ответ. Как мы можем обрабатывать нулевую ссылку? – asitis

+1

Лично я предпочитаю строить 'XName' с помощью 'XName + (XNamespace, string)' - Мне гораздо проще читать, чем вызвать 'XName.Get'. –

+0

@JonSkeet Ну, честно говоря, я даже не знал, что вы можете конкатенировать XNamespace и XName, пока я не прочитаю ваш ответ. –

1

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

XNamespace atom = "http://www.w3.org/2005/Atom"; 
... 
rss.Link1 = rssItem.Element(atom + "link").Attribute("href").Value; 

LINQ to XML делает обработку пространства имен намного проще, чем любой другой XML API, который я видел, но вы все равно должны знать об этом. (Я удивлен, что другие элементы не в пространстве имен, если честно.)

Я также превратить ваш foreach цикл в запрос LINQ:

var items = xmlItems.Descendants("item") 
        .Select(x => new RSSItem { 
         Description1 = x.Element("description").Value, 
         Link1 = x.Element(atom + "link").Attribute("href").Value, 
         Title1 = x.Element("title").Value, 
         ... 
        }) 
        .ToList(); 

рассмотреть также с помощью приведения к string вместо свойства Value, если некоторые из элементов могут отсутствовать - это приведет к тому, что соответствующее свойство будет иметь значение null, вместо того, чтобы бросать NullReferenceException.

EDIT: Если link элемент отсутствует, вы можете исправить это:

Link1 = (string) x.Elements(atom + "link").Attributes("href").FirstOrDefault() 

Это будет найти первый атрибут href внутри атома link элемента, или использовать нуль - а затем бросок к string будет просто верните null, если нет атрибута. (Это часть пользовательского преобразования от XAttribute до string.)

+0

очень спасибо за информацию – asitis

+0

Как мы можем обрабатывать нулевую ссылку, так как для некоторых элементов тега Atom нет? ? – asitis

+1

@asitis: Будет ли это редактировать. –

Смежные вопросы