2016-11-14 5 views
0

, also habe ich einige Probleme mit meinem XPath keine Knoten aus einem XML-Baum auswählen. Hier ist mein Code so weit:XPath mit XmlDocument nicht Knoten finden

var reader = new XmlDocument(); 
reader.Load(@"http://www.fieldgulls.com/rss/current"); 

XmlNodeList list = reader.SelectNodes("./entry"); 

Ich habe auch XPath-Werte von */Eintrag, // Eintrag und andere versucht. Ich kann jedoch nichts zur Arbeit bringen. Was mache ich falsch?

+0

Sie XML-Knoten sind wahrscheinlich in einem Namespace, aber ohne [mcve] können wir nicht sicher sein. Können Sie Ihre Frage bearbeiten, um das XML zu integrieren? Oder lesen Sie [Verwenden von Xpath mit Standard-Namespace in C#] (https://stackoverflow.com/questions/585812/using-xpath-with-default-namespace-in-c-sharp/2911160#2911160) für eine allgemeine Antwort auf how um Knoten mit Namespaces auszuwählen. – dbc

+0

Oh - '" http://www.fieldgulls.com/rss/current "' ist die tatsächliche Live-URL. In diesem Fall ist der korrekte Namespace für die Knoten "" 'xmlns =" ​​http://www.w3.org/2005/Atom "' – dbc

Antwort

1

Das Problem ist, dass die Elemente <Entry> tatsächlich im Standard-Namespace des Root-Knotens sind, die "http://www.fieldgulls.com/rss/current" ist:

<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> <!--The default namespace for nested elements is set here with the xmlns= attribute --> 
    <title>Field Gulls - All Posts</title> 
    <subtitle>The stupidest name in smart football analysis.</subtitle> 
    <icon>https://cdn3.vox-cdn.com/community_logos/50215/fieldgulls-fav.png</icon> 
    <updated>2016-11-13T17:00:02-08:00</updated> 
    <id>http://www.fieldgulls.com/rss/current/</id> 
    <link type="text/html" href="http://www.fieldgulls.com/" rel="alternate"/> 
    <entry> 
    <!--Remainder commented out--> 

So müssen Sie Knoten wählen Sie den entsprechenden Namespace und die entsprechende SelectNodes() Überschreibung mit:

var reader = new XmlDocument(); 
reader.Load(@"http://www.fieldgulls.com/rss/current"); 

var nsmgr = new XmlNamespaceManager(reader.NameTable); 
nsmgr.AddNamespace("a", "http://www.w3.org/2005/Atom"); 

XmlNodeList list = reader.SelectNodes(".//a:entry", nsmgr); 

In Fällen wie diesen, finde ich es hilfreich, den folgenden Debug-Dienstprogramm auf der neueren LINQ to XML Klassenbibliothek basierte zu verwenden, den Namensraum von jedem Knoten zu machen appare zt:

public static class XObjectExtensions 
{ 
    public static IEnumerable<string> DumpXmlElementNames(this XDocument doc) 
    { 
     return doc.Root.DumpXmlElementNames(); 
    } 

    public static IEnumerable<string> DumpXmlElementNames(this XElement root) 
    { 
     if (root == null) 
      return Enumerable.Empty<string>(); 
     var startCount = root.AncestorsAndSelf().Count(); 
     return root.DescendantsAndSelf().Select(el => string.Format("{0}\"{1}\"", 
      new string(' ', 2 * (el.AncestorsAndSelf().Count() - startCount)), el.Name.ToString())); 
    } 
} 

Dann, wenn das Debuggen, würden Sie tun:

Console.WriteLine("Dumping a list of all element names and namespaces: "); 
Console.WriteLine(String.Join("\n", XDocument.Load(@"http://www.fieldgulls.com/rss/current").DumpXmlElementNames())); 

, die einen Ausgang erzeugt, der mit Beginn des Einsatzes:

"{http://www.w3.org/2005/Atom}feed" 
    "{http://www.w3.org/2005/Atom}title" 
    "{http://www.w3.org/2005/Atom}subtitle" 
    "{http://www.w3.org/2005/Atom}icon" 
    "{http://www.w3.org/2005/Atom}updated" 
    "{http://www.w3.org/2005/Atom}id" 
    "{http://www.w3.org/2005/Atom}link" 
    "{http://www.w3.org/2005/Atom}entry" 

Probe fiddle.

0

Versuchen Sie SyndicationFeed Klasse zu verwenden. Es macht einfach mit RSS zu arbeiten.

using (var xmlReader = XmlReader.Create(@"http://www.fieldgulls.com/rss/current")) 
{ 
    var feed = SyndicationFeed.Load(xmlReader); 

    foreach (var item in feed.Items) 
    { 
     // use item.Title.Text and so on 
    } 
} 
Verwandte Themen