2013-12-13 135 views
0

我發現很難解析下面的xml結構(使用c#.net 4.5)並存儲在數據庫(Sql-Server)中。用多個元素解析XML

我知道如何解析,只要每個記錄有一個屬性,例如出版商;日期(年份),但從作者內部的結構看,有不止一個,這是我掙扎的地方。

我使用XmlNodeList,XmlNode和InnerText從每個元素中提取數據。

欣賞你的時間和幫助

XML結構

<Books> 
    <Book> 
    <title></title> 
    <date> 
     <year></year> 
    </date> 
    <Link></link> 
    <summary></summary> 
    <publisher> 
     <name></name> 
    </publisher> 
    <authors total="2"> 
     <author> 
     <name></name> 
     </author> 
     <author> 
     <name></name> 
     </author> 
    </authors> 
    </Book> 
</Books> 

我現在已經連接,我使用不同的(因爲有不同於其他多個屬性的話)的正常工作的代碼

XmlDocument xml = new XmlDocument(); 
       xml.LoadXml(/*Here I pass the xml which has been stored in string variable. The structure of which has been in my original post*/); 
       XmlNodeList xnList = xml.SelectNodes("/Books[@*]"); 
       foreach (XmlNode xn in xnList) 
       { 
        XmlNodeList anodes = xn.SelectNodes("Book"); 
        foreach (XmlNode node in anodes) 
        { 
         if (anodes != null) 
         { 
          titles.Add(node["title"].InnerText); //titles is an list 
          summarys.Add(node["summary"].InnerText);//Summarys is an list 
          link.Add(node["Link"].InnerText);//link is an list 
          counter +=1; 
           } 
         } 
          XmlNodeList CNodes = xn.SelectNodes("Book"); 
          foreach (XmlNode node2 in CNodes) 
          { 
           XmlNode example = node2.SelectSingleNode("date"); 
           if (example != null) 
           { 
            years.Add(example["year"].InnerText);//years is an list 
           } 
          } 
          XmlNodeList dNodes = xn.SelectNodes("Book"); 
          foreach (XmlNode node3 in dNodes) 
          { 
           XmlNode example1 = node3.SelectSingleNode("publisher"); 
           if (example1 != null) 
           { 
            publishers.Add(example1["name"].InnerText);//publishers is an list 
           } 
          } 

          XmlNodeList fnodes = xn.SelectNodes("Book/authors/author/name"); 
           foreach (XmlNode node5 in fnodes) 
           { 

            authors.Add(node5 != null ? node5.InnerText : "");//authors is an list. For the first book i need to store in list[0] and next in list[1] 

            } 
          } 
     // Convert list to array 
          titles.ToArray(); 
          summarys.ToArray(); 
          urls.ToArray(); 
          years.ToArray(); 
          publishers.ToArray(); 
          authors.ToArray(); 
+1

「*這是我很努力*」 你怎麼努力下?你能否向我們展示一段代碼,以便我們瞭解哪些事情不適合你? – JDB

回答

0

我希望這個代碼將幫助您:

  XDocument xDoc = XDocument.Load("asd"); 
      var book = (from b in xDoc.Descendants("Book") 
       select new Book 
       { 
        Title = b.Element("title").Value, 
        Year = b.Element("date").Element("Year").Value, 
        Link = b.Element("link").Value, 
        Summary = b.Element("summary").Value, 
        Publisher = b.Element("publisher").Element("name").Value, 
        Authors = (from a in b.Element("authors").Elements("author") 
            select a.Element("name").Value).ToList(), 
       }).First(); 

Book類:

class Book 
{ 
    public string Title { get; set; } 

    public string Year { get; set; } 

    public string Link { get; set; } 

    public string Summary { get; set; } 

    public string Publisher { get; set; } 

    public List<string> Authors { get; set; } 
} 

PS:的XDocument類是System.Xml.Linq的命名空間

+0

謝謝Selman22,現在也在研究你的邏輯。請看看我更新的帖子(附上代碼),並提供您的意見,如果有的話。 – user3100084