繁体   English   中英

解析XML有多个元素

[英]Parsing XML with more than one element

我发现很难解析以下xml结构(使用c#.net 4.5)并将其存储在DB(Sql-Server)中。

我知道如何解析,只要每条记录都有一个属性,例如Publisher; 日期(年),但是从作者的结构中可以看出,有多个,这是我在努力的地方。

我使用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();

希望这段代码对您有帮助:

            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命名空间下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM