XDocument.Descendants (itemName) - Probleme qualifizierte Namen zu finden,
-
29-09-2019 - |
Frage
Ich versuche, einen XML-RSS-Feed von einer Website zu lesen. Deshalb verwende ich einen Asynchron-Download und eine XDocument
mit der XDocument.Parse()
Methode erstellen.
Das Dokument soll sehr einfach sein, wie folgt:
<root>
<someAttribute></SomeAttribute>
<item>...</item>
<item>...</item>
</root>
Jetzt möchte ich alle Elemente auszulesen. Deshalb habe ich versucht:
foreach (XElement NewsEntry in xDocument.Descendants("item"))
, aber das funktioniert nicht. Also habe ich einen Beitrag in diesem Forum gefunden den qualifizierten Namen zu verwenden, da gibt es einige Namensräume im Stammelement definiert:
<?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/">
gut, habe ich versucht alle 3 verfügbaren Namespaces - nichts für mich gearbeitet:
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/");
Jede mögliche Hilfe würde geschätzt. (In der Regel mache ich die XML-Analyse mit Regex -. Aber dieses Mal habe ich für ein mobiles Gerät bin zu entwickeln, und müssen daher über die Leistung kümmern)
Lösung
Sie haben nicht versucht, die Standard-Namespace bei der Ende der rdf
Erklärung:
xmlns="http://purl.org/rss/1.0/"
Dies macht Sinn, da jedes Element in dem Standard-Namespace nicht den Namensraum benötigen, um zu dem Elementnamen vorangestellt.
Andere Tipps
Nicht direkt eine Lösung für die XDocument RSS lesen Problem. Aber warum nicht verwenden Sie die mitgelieferte SyncdicationFeed Klasse das Feed zu laden? http://msdn.microsoft.com/en-us /library/system.servicemodel.syndication.syndicationfeed.aspx
Versuchen Sie diese
var elements = from p in xDocument.Root.Elements()
where p.Name.LocalName == "item"
select p;
foreach(var element in elements)
{
//Do stuff
}