XDocument.Descendants (ITEMNAME) - Problemas para encontrar nombre calificado
-
29-09-2019 - |
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)
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
}