2013-12-13 6 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(); 

Книга Класс:

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

Смежные вопросы