16 Stimmen

SelectNodes funktioniert nicht bei Stackoverflow-Feed

Ich versuche, Unterstützung für Stackoverflow-Feeds in meinem RSS-Reader hinzuzufügen, aber SelectNodes und SelectSingleNode haben keine Wirkung. Das hat wahrscheinlich etwas mit ATOM und XML-Namespaces zu tun, die ich noch nicht verstehe.

Ich habe es zum Laufen gebracht, indem ich alle Attribute des feed-Tags entfernt habe, aber das ist ein Hack und ich würde es gerne richtig machen. Also, wie benutzt man SelectNodes mit Atom-Feeds?

Hier ist ein Auszug aus dem Feed.

StackOverflow.com - Fragen mit dem Tag: c

Schauen Sie die neuesten Beiträge auf StackOverflow.com an
2008-08-24T12:25:30Z
http://stackoverflow.com/feeds/tag/c
http://www.creativecommons.org/licenses/by-nc/2.5/rdf

   http://stackoverflow.com/questions/22901/what-is-the-best-way-to-communicate-with-a-sql-server
   Was ist der beste Weg, um mit einem SQL Server zu kommunizieren?

   Ed

   2008-08-22T05:09:04Z
   2008-08-23T04:52:39Z
   <p>Ich werde c/c++ verwenden und würde gerne den besten Weg wissen, um mit einem MySQL-Server zu kommunizieren. Sollte ich die Bibliothek verwenden, die mit der Serverinstallation geliefert wird? Gibt es gute Bibliotheken, die ich außer der offiziellen in Betracht ziehen sollte?</p>

   2

Die Lösung

XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("atom", "http://www.w3.org/2005/Atom");
doc.Load(feed);

// erfolgreich
XmlNodeList itemList = doc.DocumentElement.SelectNodes("atom:entry", nsmgr);

0 Stimmen

Nsmgr.AddNamespace("atom", "w3.org/2005/Atom"); <- Verbindet sich tatsächlich über das Internet mit dieser URL, um das Schema zu erhalten? Und was passiert, wenn es keine Verbindung zu dieser URL herstellen kann?

9voto

Brad Wilson Punkte 64944

Verwechseln Sie nicht die Namensraumnamen in der XML-Datei mit den Namensraumnamen für Ihren Namensraum-Manager. Beide sind Abkürzungen und müssen nicht unbedingt übereinstimmen.

Sie können also "http://www.w3.org/2005/Atom" als "atom" registrieren und dann ein SelectNodes für "atom:entry" durchführen.

6voto

Julio César Punkte 11682

Sie müssen möglicherweise einen XmlNamespaceManager hinzufügen.

XmlDocument document = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("creativeCommons", "http://backend.userland.com/creativeCommonsRssModule");
// Fügen Sie auch für andere Namespaces ein AddNamespace hinzu.
document.Load(feed);

Es ist erforderlich, wenn Sie SelectNodes auf einem Dokument aufrufen möchten, das sie verwendet. Welchen Fehler sehen Sie?

2voto

Brad Wilson Punkte 64944

Sie haben richtig geraten: Sie fragen nach Knoten, die nicht in einem Namespace sind, aber diese Knoten befinden sich in einem Namespace.

Beschreibung des Problems und Lösung: http://weblogs.asp.net/wallen/archive/2003/04/02/4725.aspx

0voto

sieben Punkte 2091

Ich möchte nur verwenden...

XmlNodeList itemList = xmlDoc.DocumentElement.SelectNodes("entry");

aber zu welchem Namensraum gehören die entry Tags? Ich nehme an, xmlns="http://www.w3.org/2005/Atom", aber es hat keinen Titel. Wie würde ich diesen Namensraum hinzufügen?

XmlDocument document = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("", "http://www.w3.org/2005/Atom");
document.Load(feed);

So etwas wie das?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X