2009-10-11 153 views
1

我有一個看起來像一個XML文件:如何解析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> 

...而且我對如何讀它很迷​​茫。我只想將標題,說明和URL分爲不同的字符串。喜歡的東西:

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

...我已經看了這麼多教程,但所有的人似乎並不相對於什麼,我需要做的..有人可以幫我這個?

+0

感謝約翰·桑德斯,我爲這是一個重複的道歉,但我只是不明白,我在S/O – 2009-10-11 03:49:57

+0

我刪除了我的評論中發現其他的答案;我建議你刪除你的評論以及 – 2015-06-21 04:31:08

回答

5

到LINQ擴展到XML的建議,您可以使用SELECT子句來創建對象代表解析鏈接:

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); 

在這種情況下,links將有一個匿名類型對象的可序列DescriptionUrl屬性,其中Url已解碼。這foreach會顯示這樣的事情:

<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

非常感謝你@dahlbyk,但有一個錯誤,我完全不知道他們的意思(ive從來沒有做過什麼與linq或xml之前)...你能幫我找出這些錯誤是什麼意思?它說「HttpUtility在當前上下文中不存在」。請幫助... +1 – 2009-10-11 03:55:03

+0

HttpUtility生活在System.Web - 在你的文件的頂部,確保你有:using System.Web; – dahlbyk 2009-10-11 05:02:03

+0

我實際上做到了這一點,但仍然是同樣的問題... – 2009-10-11 05:17:47

6

如果您使用的是.NET 3.5,我建議使用LINQ to 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"); 
} 

這也使您可以使用內置的「查詢」語法,所以你可以做這樣的事情...

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"); 

(根據註釋編輯)

+5

對於L2XML的+1。建議將字符串轉換爲字符串,而不是.Value以避免null問題:(string)insideLink.Element(「description」) – dahlbyk 2009-10-11 03:10:25

+1

感謝您指出這一點,我不知道這是可能的。 (這也導致我搜索了一個關於重載演員操作符的Google搜索,我也不知道在C#中可以使用D) – 2009-10-11 03:23:28

+1

很高興能夠提供幫助!沒有足夠的圖書館提供智能轉換,因此人們不會考慮使用它們,但XElement絕對是正確的(字符串,值和可空類型)。 – dahlbyk 2009-10-11 03:32:01

2

試試這個:

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

比你這個,雖然我一直收到一個錯誤,當調試說xml文件中有多個根元素...你知道這意味着什麼嗎? – 2009-10-11 03:34:09

+1

你的xml不是良構;你必須只有一個根元素 – 2009-10-11 03:55:46

+0

謝謝@Rubens :)生病了解決了 – 2009-10-11 04:15:51