2015-03-16 4 views
1

Ceci est mon flux.Lire XML en utilisant XmlDocument

<feed xml:lang=""> 
    <title>NEWS.com.au | Top Stories</title> 
    <link rel="self" href="http://feeds.news.com.au/public/atom/1.0/news_top_stories_48_48.xml"/> 
    <link rel="alternate" href="http://news.com.au"/> 
    <id>http://news.com.au</id> 
    <rights/> 
    <entry> 
     <title>F1’s glaring issues exposed</title> 
     <link href="www.google.com"/> 
     <author> 
     <name>STEVE LARKIN</name> 
     </author> 
     <link rel="enclosure" type="image/jpeg" length="2373" href="abc.jpg"/> 
    </entry> 
    <entry> 
     ..... 
    </entry> 
</feed> 

Voici comment je lis le xml.

string downloadfolder = "C:/Temp/Download/abc.xml"; 
    XmlDocument xml = new XmlDocument(); 
    xml.Load(downloadfolder); 
    XmlNamespaceManager nsmgr = new System.Xml.XmlNamespaceManager(xml.NameTable); 
    nsmgr.AddNamespace("atom", "http://www.w3.org/2005/Atom"); 
    string xpath_title = "atom:feed/atom:entry/atom:title"; 
    XmlNodeList nodes_title = xml.SelectNodes(xpath_title, nsmgr); 

    foreach (XmlNode node_title in nodes_title) 
    { 
     Console.WriteLine(node_title.InnerText); 
    } 

string xpath_author = "atom:feed/atom:entry/atom:author"; 
    XmlNodeList nodes_author = xml.SelectNodes(xpath_author, nsmgr); 

    foreach (XmlNode node_author in nodes_author) 
    { 
     Console.WriteLine(node_author.InnerText); 
    } 

string xpath_link = "atom:feed/atom:entry/atom:link"; 
    XmlNodeList nodes_link = xml.SelectNodes(xpath_link, nsmgr); 

    foreach (XmlNode node_link in nodes_link) 
    { 
     Console.WriteLine(node_link.Attributes["href"].Value); 
    } 

Je veux lire le titre, lien, auteur à l'intérieur du nœud <entry>. Je définis xpath puis itérativement les valeurs de chaque nœud. Y at-il un autre moyen de définir une fois xpath et d'itérer toutes les valeurs du nœud <entry>

+0

Que voulez-vous faire exactement avec les données que vous "lisez"? Évidemment, vous n'essayez pas de faire 'Console.WriteLine'. –

+0

J'ai modifié votre titre. S'il vous plaît voir, "[Les questions devraient inclure" tags "dans leurs titres?] (Http://meta.stackexchange.com/questions/19190/)", où le consensus est "non, ils ne devraient pas". –

+0

merci @JohnSaunders je vais stocker les données dans un datatable. – user3754676

Répondre

0

Pour fonctionner sur tous les nœuds enfants du nœud <entry>, vous pouvez arrêter votre XPath au /atom:entry. Ensuite, à l'intérieur de la boucle, sélectionnez chaque nœuds enfants que vous voulez, par exemple:

...... 
String xpath = "atom:feed/atom:entry"; 
XmlNodeList nodes2 = xml.SelectNodes(xpath, nsmgr); 

foreach (XmlNode node in nodes2) 
{ 
    var title = node.SelectSingleNode("./atom:title", nsmgr).InnerText; 
    var link1 = node.SelectSingleNode("./atom:link[1]", nsmgr).Attributes["href"].Value; 
    //go on to select and operate on the rest child nodes 
    //....... 
} 

Notez que vous devez ajouter un point (.) au début du XPath pour faire contexte XPath par rapport au courant node au lieu de le document XML entier.

+0

parfait merci beaucoup – user3754676

0

Pour lire l'attribut href, vous devez modifier votre expression xpath. ..

string xpath = "atom:feed/atom:entry/atom:link"; 

Ceci parcourra tous les liens dans les entrées. Ensuite, vous aurez besoin de lire que la valeur de attibute spécifique au lieu de lire le InnerText

Console.WriteLine(node.Attributes["href"].Value); 

Maintenant, si vous voulez lire tout à l'intérieur des éléments entry, XPath va rapidement obtenir votre code un peu en désordre. Une solution plus propre, à mon humble avis, utiliserait la sérialisation xml afin que vous puissiez facilement analyser/sérialiser des "entrées" dans des objets POCO. Ensuite, vous pouvez faire ce que vous voulez avec ces objets

+0

merci pour la solution cela fonctionne bien mais dois-je définir séparer xpath pour lire le titre et l'auteur? – user3754676

+0

@ user3754676 c'est exactement ce que je dis, vous pouvez toujours parcourir toutes les entrées et utiliser les méthodes 'XmlNode' pour extraire ces données dans la boucle 'foreach' – Leo

+0

@ user3754676 ou, utiliser la sérialisation xml à la place – Leo