Pregunta

Estoy intentando leer un XML-RSS-Feed de un sitio web. Por tanto, yo utilizo una descarga asíncrona y crear un XDocument con el Método XDocument.Parse().

El documento tiene la intención de ser muy simple, como esto:

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

Ahora quiero leer todos los artículos. Por lo tanto he intentado:

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

pero esto no funciona. Así que encontré un post en este foro a utilizar el nombre completo, porque hay algunos espacios de nombres definidos en el elemento raíz:

<?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/">

bueno, lo intente los 3 espacios de nombres disponibles - nada funcionó para mí:

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/");

Cualquier ayuda sería apreciada. (Por lo general, estoy haciendo el XML-análisis con expresiones regulares -. Pero esta vez estoy desarrollando para un dispositivo móvil, y por lo tanto necesitan preocuparse por el rendimiento)

¿Fue útil?

Solución

No se ha probado el predeterminado espacio de nombres en el final de la declaración rdf:

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

Esto tiene sentido, ya que no se necesita ningún elemento en el espacio de nombres predeterminado para tener el espacio de nombres antes del nombre de elemento.

Otros consejos

No directamente una solución al problema XDocument RSS leer. Pero por qué no se está utilizando la clase SyncdicationFeed proporcionado para cargar la alimentación? http://msdn.microsoft.com/en-us /library/system.servicemodel.syndication.syndicationfeed.aspx

Probar

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

foreach(var element in elements)
{
//Do stuff
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top