2009-02-01 9 views
6

J'essaye d'analyser un flux Atom par programme. J'ai l'atome XML téléchargé en tant que chaîne. Je peux charger le XML dans un XmlDocument. Cependant, je ne peux pas parcourir le document en utilisant XPath. Chaque fois que j'essaie, j'obtiens null.Aucun noeud sélectionné à partir du document XML Atom à l'aide de XPath?

Je me sers de ce flux Atom comme un test: http://steve-yegge.blogspot.com/feeds/posts/default

Appel SelectSingleNode() revient toujours null, sauf quand je l'utilise "/". Voici ce que je suis en train en ce moment:

using (WebClient wc = new WebClient()) 
{ 
    string xml = wc.DownloadString("http://steve-yegge.blogspot.com/feeds/posts/default"); 
    XmlNamespaceManager nsMngr = new XmlNamespaceManager(new NameTable()); 
    nsMngr.AddNamespace(string.Empty, "http://www.w3.org/2005/Atom"); 
    nsMngr.AddNamespace("app", "http://purl.org/atom/app#"); 
    XmlDocument atom = new XmlDocument(); 
    atom.LoadXml(xml); 
    XmlNode node = atom.SelectSingleNode("//entry/link/app:edited", nsMngr); 
} 

Je pensais que cela aurait pu être à cause de mon XPath, donc j'ai aussi essayé une simple requête du nœud racine car je savais que la racine devrait fonctionner:

// I've tried both with & without the nsMngr declared above 
XmlNode node = atom.SelectSingleNode("/feed"); 

Peu importe ce que je fais, il semble qu'il ne puisse rien sélectionner. Évidemment, il me manque quelque chose, je ne peux pas comprendre quoi. Qu'est-ce que je dois faire pour que XPath fonctionne sur ce flux Atom?

EDIT

Bien que cette question a une réponse, je trouve cette question a un double presque exacte: SelectNodes not working on stackoverflow feed

+0

double possible de [SelectNodes ne fonctionne pas sur l'alimentation stackoverflow] (http://stackoverflow.com/questions/24734/selectnodes-not-working-on-stackoverflow-feed) –

Répondre

8

Alors que la mise en œuvre C# peut permettre namespaces par défaut (je ne sais pas), la spécification XPath 1.0 ne fonctionne pas. Alors, donnez "Atom" son propre préfixe:

nsMngr.AddNamespace("atom", "http://www.w3.org/2005/Atom"); 

Et changer votre XPath appropriée:

XmlNode node = atom.SelectSingleNode("//atom:entry/atom:link/app:edited", nsMngr); 
0

XML de charge à partir d'une chaîne et recherche pour tous les nœuds 'Erreurs/erreur'.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xmlResult);    
XmlNamespaceManager nm = new XmlNamespaceManager(xmlDoc.NameTable); 
nm.AddNamespace("ns", "http://somedomain.com/namespace1/2"); //ns - any name, make sure it is same in the below line 

XmlNodeList errors = xmlDoc.SelectNodes("/ns:*//ns:Errors/ns:Error", nm);  

-Mathulan

Questions connexes