将XML解析为数据库

时间:2015-01-10 23:30:40

标签: c# xml parsing

我正在从Web解析XML文件并将元素保存到我的数据库中。 所有变量都是字符串类型,以方便使用。 我可以保存7个字段中的5个。当我尝试解析所有7条记录时,我只得到80条记录,如果我评论2条不起作用的行,我会得到17000条记录。有谁知道为什么它停在89条记录?

以下是代码:

var xml = new XmlDocument();

xml.Load("http://www.systembolaget.se/Assortment.aspx?Format=Xml");

XmlNodeList documentNodeList = xml.DocumentElement.SelectNodes("/artiklar/artikel");

IList<Systembolaget> whiskies = new List<Systembolaget>();
if (documentNodeList.Count > 0)
{
    foreach (XmlNode row in documentNodeList)
    {
        Systembolaget sb = new Systembolaget();

        sb.ArtikelId = (string)row.SelectSingleNode("Artikelid").InnerText;
        sb.SaljStart = (string)row.SelectSingleNode("Saljstart").InnerText;
        sb.Ursprunglandnamn = (string)row.SelectSingleNode("Ursprunglandnamn").InnerText;
        sb.VaruNamn = (string)row.SelectSingleNode("Namn").InnerText + " " + row.SelectSingleNode("Namn2").InnerText;
        //sb.Argang = (string)row.SelectSingleNode("Argang").InnerText;
        sb.Alkoholhalt = (string)row.SelectSingleNode("Alkoholhalt").InnerText;
        sb.Volym = (string)row.SelectSingleNode("Volymiml").InnerText;
        sb.Pris = (string)row.SelectSingleNode("Prisinklmoms").InnerText;
        /*
        if (row.SelectSingleNode("Varugrupp").InnerText.StartsWith("Whisky"))
        {
            var rowVarugrupp = (string)row.SelectSingleNode("Varugrupp").InnerText;
            sb.Varugrupp = rowVarugrupp;
        }*/

        whiskies.Add(sb);

        ISystembolagetRepository sbDao = daoFactory.GetSystembolagetRepository();
        sbDao.SaveOrUpdate(sb);

2 个答案:

答案 0 :(得分:2)

如果你通过注释掉IF块来获得80条记录,这意味着你在xml中的第81条记录是违规记录。最有可能的名称为“Varugrupp”的xml节点不存在,或者您在xpath中拼错了它。还记得xpath是区分大小写的。 以下语句可能会产生null,因此可能会抛出异常。

row.SelectSingleNode("Varugrupp")

你可以通过改变条件如下来解决这个问题

if (row.SelectSingleNode("Varugrupp")!=null && row.SelectSingleNode("Varugrupp").InnerText.StartsWith("Whisky"))
{
   var rowVarugrupp = (string)row.SelectSingleNode("Varugrupp").InnerText;
   sb.Varugrupp = rowVarugrupp;
}

答案 1 :(得分:1)

第81条记录中缺少

<Varugrupp>。您是否尝试过使用Linq to Xml来读取您的Xml?我认为使用它更容易:

        XDocument document = XDocument.Load("http://www.systembolaget.se/Assortment.aspx?Format=Xml");

        List<Systembolaget> whiskies = new List<Systembolaget>();

        foreach(XElement element in document.Element("artiklar").Elements("artikel"))
        {
            Systembolaget sb = new Systembolaget();

            sb.ArtikelId = element.Element("Artikelid").Value;
            sb.SaljStart = element.Element("Saljstart").Value;
            sb.Ursprunglandnamn = element.Element("Ursprunglandnamn").Value;
            sb.VaruNamn = element.Element("Namn").Value + element.Element("Namn2").Value;
            sb.Argang = element.Element("Argang").Value;
            sb.Alkoholhalt = element.Element("Alkoholhalt").Value;
            sb.Volym = element.Element("Volymiml").Value;
            sb.Pris = element.Element("Prisinklmoms").Value;

            if (element.Element("Varugrupp") != null && element.Element("Varugrupp").Value.StartsWith("Whisky"))
            {
                sb.Varugrupp = element.Element("Varugrupp").Value;
            }

            whiskies.Add(sb);
        }