Pregunta

Estoy tratando de agregar soporte para las fuentes de flujo de pila en mi lector de RSS, pero SelectNodes y SelectSingleNode no tienen ningún efecto. Probablemente esto sea algo relacionado con los espacios de nombres ATOM y xml que aún no entiendo.

Lo he hecho funcionar al eliminar todos los atributos de la etiqueta feed , pero eso es un truco y me gustaría hacerlo correctamente. Entonces, ¿cómo utiliza SelectNodes con feeds atómicos?

Aquí hay un fragmento del feed.

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:thr="http://purl.org/syndication/thread/1.0">

<title type="html">StackOverflow.com - Questions tagged: c</title>
<link rel="self" href="http://stackoverflow.com/feeds/tag/c" type="application/atom+xml" />
<subtitle>Check out the latest from StackOverflow.com</subtitle>
<updated>2008-08-24T12:25:30Z</updated>
<id>http://stackoverflow.com/feeds/tag/c</id>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>


 <entry>
   <id>http://stackoverflow.com/questions/22901/what-is-the-best-way-to-communicate-with-a-sql-server</id>
   <title type="html">What is the best way to communicate with a SQL server?</title>
   <category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="c" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="c++" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="sql" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="mysql" /><category scheme="http://stackoverflow.com/feeds/tag/c/tags" term="database" />  
   <author><name>Ed</name></author>
   <link rel="alternate" href="http://stackoverflow.com/questions/22901/what-is-the-best-way-to-communicate-with-a-sql-server" />
   <published>2008-08-22T05:09:04Z</published>
   <updated>2008-08-23T04:52:39Z</updated>
   <summary type="html">&lt;p&gt;I am going to be using c/c++, and would like to know the best way to talk to a MySQL server.  Should I use the library that comes with the server installation?  Are they any good libraries I should consider other than the official one?&lt;/p&gt;</summary>
   <link rel="replies" type="application/atom+xml" href="http://stackoverflow.com/feeds/question/22901/answers" thr:count="2"/>
   <thr:total>2</thr:total>
 </entry>


</feed>


La solución

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

// successful
XmlNodeList itemList = doc.DocumentElement.SelectNodes("atom:entry", nsmgr);
¿Fue útil?

Solución

No confunda los nombres de espacio de nombres en el archivo XML con los nombres de espacio de nombres para su administrador de espacio de nombres. Ambos son atajos, y no necesariamente tienen que coincidir.

Para que pueda registrarse " http://www.w3.org/2005/Atom " como " atom " ;, y luego haga un SelectNodes para " atom: entry " ;.

Otros consejos

Es posible que necesites agregar un XmlNamespaceManager

XmlDocument document = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("creativeCommons", "http://backend.userland.com/creativeCommonsRssModule");
// AddNamespace for other namespaces too.
document.Load(feed);

Es necesario si desea llamar a SelectNodes en un documento que los usa. ¿Qué error estás viendo?

Has adivinado correctamente: estás pidiendo nodos que no estén en un espacio de nombres, pero estos nodos están en un espacio de nombres.

Descripción del problema y solución: http: // weblogs.asp.net/wallen/archive/2003/04/02/4725.aspx

Solo quiero usar ..

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

pero, ¿en qué espacio de nombres se encuentran las etiquetas de entrada ? Supongo que xmlns = " http: //www.w3.org/2005/Atom" ;, pero no tiene título, entonces, ¿cómo agregaría ese espacio de nombres?

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

¿Algo así?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top