Laden...

ATOM-Newsfeed einlesen

Erstellt von LonelyPixel vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.206 Views
L
LonelyPixel Themenstarter:in
333 Beiträge seit 2007
vor 16 Jahren
ATOM-Newsfeed einlesen

Hallo,

ich versuche gerade, einen ATOM-Newsfeed einzulesen. Der sieht ja in etwa so aus:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>...</title>
    <entry>
        <title>...</title>
    </entry>
</feed>

Dieser Standard-Namespace bringt mich noch in den Wahnsinn. Ich habe es bereits geschafft, XMP-Daten einzulesen, da gibt's aber nur andere Namespaces, keinen "xmlns:". Hier ist mein Code:

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(response);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
nsMgr.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom");
foreach (XmlNode node in xdoc.DocumentElement.SelectNodes("entry"))
{ ... }

Alternativ hab ich auch sowas versucht:

foreach (XmlNode node in xdoc.SelectNodes("/feed/entry"))

Nichts hat funktioniert. Das Ergebnis ist immer dasselbe: SelectNodes liefert keinen Node zurück. Er findet einfach nichts. Woran kann das liegen? Ich hab das ganze jetzt schon x-mal durch debuggt, kann aber keinen Fehler finden. Ich hab aber mit XPath auch nicht viel mehr Erfahrung, als man vom CSS-Schreiben bekommt und mit Namespaces steh ich auf Kriegsfuß. 🙁

L
LonelyPixel Themenstarter:in
333 Beiträge seit 2007
vor 16 Jahren

Aha, sehr schön. Um mit XPath irgendwas zu finden, das einen Standardnamespace hat, muss man für diesen zuerst einen Alias anlegen, um ihn zu adressieren. Einfach geht da gar nichts. Hier die Lösung:

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(response);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
nsMgr.AddNamespace(String.Empty, "http://www.w3.org/2005/Atom");
nsMgr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
foreach (XmlNode node in xdoc.SelectNodes("/atom:feed/atom:entry", nsMgr))
{ ... }
103 Beiträge seit 2006
vor 16 Jahren

Die Zeile mit dem String.Empty kannst du m.E. weglassen.

OUT! OUT! You demons of stupidity!
-Dogbert

L
LonelyPixel Themenstarter:in
333 Beiträge seit 2007
vor 16 Jahren

Tatsächlich. Okay, das lässt die ganze Namespacerei wieder etwas plausibler erscheinen. 🙂

1
310 Beiträge seit 2006
vor 16 Jahren

Und wie navigiert man in den node-Elementen dann weiter? Will in einem Feed zum Beispiel auf das vorhandene Element "title" zugreifen, aber dieses wird nicht gefunden.

foreach (XmlNode node in atomDoc.SelectNodes("/atom:feed/atom:entry", nsMgr))
 {                   
         XmlNode newNode = node.SelectSingleNode("/atom:title",nsMgr);

         if (newNode != null)
         {
              ...
         }

}