2009-10-11 12 views
1

J'ai un fichier XML qui ressemble à:Comment analyser un fichier XML

<results> 
    <result> 
     <title>Welcome+to+The+JASON+Project%21</title> 
     <url>http%3A%2F%2Fwww.jason.org%2F</url> 
     <domain /> 
     <inside_links> 
     <inside_link> 
      <description>News</description> 
      <url>http%3A%2F%2Fwww.jason.org%2FPublic%2FNews%2FNews.aspx</url> 
     </inside_link> 
     <inside_link> 
      <description>register</description> 
      <url>http%3A%2F%2Fwww.jason.org%2Fpublic%2Fregistration%2Fregistration.aspx</url> 
     </inside_link> 
     <inside_link> 
      <description>Argonauts</description> 
      <url>http%3A%2F%2Fwww.jason.org%2FPublic%2FArgonauts%2FArgonauts.aspx</url> 
     </inside_link> 
     <inside_link> 
      <description>Curriculum</description> 
      <url>http%3A%2F%2Fwww.jason.org%2FPublic%2FCurriculum%2FCurriculum.aspx</url> 
     </inside_link> 
     <inside_link> 
      <description>Credits</description> 
      <url>http%3A%2F%2Fwww.jason.org%2Fpublic%2FMisc%2FCredits.aspx</url> 
     </inside_link> 
     </inside_links> 
     <inside_keywords>National+Science+Education+Standards, National+Geographic+Society, Physical+Science, Professional+Development, Earth+Science</inside_keywords> 
    </result> 
    </results> 

... Et je suis très confus quant à la façon de le lire. Je veux simplement obtenir le titre, la description et l'URL dans des chaînes séparées. Quelque chose comme:

foreach line in lines 
string title = gettitle; 
string description = getdescription; 
string url = geturl; 

... Je l'ai lu tant de tutoriels, mais tous semblent ne pas être par rapport à ce que je dois faire .. Quelqu'un peut-il s'il vous plaît me aider avec ça?

+0

merci john saunders, je vous présente mes excuses pour ce qui est un double, mais je ne comprenais pas d'autres réponses que je trouve sur le s/o –

+0

J'ai supprimé mon commentaire; Je vous suggère de supprimer votre commentaire ainsi –

Répondre

5

Pour étendre le LINQ à la suggestion XML, vous pouvez utiliser une clause select pour créer des objets pour représenter les liens analysables:

XDocument doc = XDocument.Load(filename); 
var links = from link in doc.Descendants("inside_link") 
      select new 
      { 
       Description = (string)link.Element("description"), 
       Url = HttpUtility.UrlDecode((string)link.Element("url")) 
      }; 

foreach(var l in links) 
    Console.WriteLine("<a href=\"{0}\">{1}</a>", l.Url, l.Description); 

Dans ce cas, links sera une séquence d'objets qui ont un type anonyme avec Description et Url propriétés, avec Url décodé. Cette foreach montrerait quelque chose comme ceci:

<a href="http://www.jason.org/Public/News/News.aspx">News</a> 
<a href="http://www.jason.org/public/registration/registration.aspx">register</a> 
... 
+0

merci beaucoup @dahlbyk, mais il y a une erreur et je n'ai absolument aucune idée de ce qu'ils signifient (je n'ai jamais rien fait avec linq ou xml avant) ... pouvez-vous m'aider à comprendre ce que ces erreurs signifient? Il dit "HttpUtility n'existe pas dans le contexte actuel." S'il vous plaît aider ... +1 –

+0

HttpUtility vit dans System.Web - en haut de votre fichier assurez-vous que vous avez: using System.Web; – dahlbyk

+0

Je l'ai fait en fait, mais toujours le même problème ... –

6

Si vous utilisez .NET 3.5, je suggère d'utiliser LINQ pour XML ...

XDocument doc = XDocument.Load(filename); 
XElement insideLinks = doc.Root.Element("result").Element("inside_links"); 
foreach (XElement insideLink in insideLinks.Elements()) 
{ 
    string description = (string)insideLink.Element("description"); 
    string url = (string)insideLink.Element("url"); 
} 

Cela vous permet également d'utiliser le haut-syntaxe « requête » de sorte que vous pourriez faire quelque chose comme ça ...

XDocument doc = XDocument.Load(filename); 
XElement insideLinks = doc.Root.Element("result").Element("inside_links"); 
var allTitles = from XElement insideLink 
       in insideLinks.Elements("inside_link") 
       select (string)insideLink.Element("title"); 

(édité par commentaire)

+5

+1 pour L2XML. Suggérerait de lancer en chaîne au lieu de .Value pour éviter les problèmes nuls: (chaîne) insideLink.Element ("description") – dahlbyk

+1

Merci de m'avoir signalé cela, je ne savais pas que c'était possible. (Cela m'a aussi conduit à une recherche sur Google sur les opérateurs de casting surchargés, que je ne savais pas non plus possible en C#: D) –

+1

Content de vous aider! Il n'y a pas assez de bibliothèques qui fournissent des distributions intelligentes pour que les gens ne pensent pas à les utiliser, mais XElement le fait vraiment bien (chaîne, valeur et types NULL). – dahlbyk

2

essayez ceci:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load("yourfile.xml"); 
foreach (XmlNode result in xmlDoc.SelectNodes("/results/result")) 
{ 
    string title = result.SelectSingleNode("title").InnerText; 
    string url = result.SelectSingleNode("url").InnerText; 
    foreach (XmlNode insideLink in result.SelectNodes("inside_links/inside_link")) 
    { 
     string description = insideLink.SelectSingleNode("description").InnerText; 
    } 
} 
+0

que vous pour cela, bien que je continue à recevoir une erreur lors du débogage en disant qu'il y a plusieurs éléments racine dans le fichier xml ... savez-vous ce que cela signifie? –

+1

votre xml n'est pas bien formé; vous devez avoir seulement un élément racine –

+0

merci @Rubens :) ill réparer cela –

Questions connexes