解析 XML 到数据库

Parse XML to database

我正在从网络解析一个 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);

如果您通过注释掉 IF 块得到 80 条记录,这意味着您在 xml 中的第 81 条记录是违规记录。很可能 xml 名称为 "Varugrupp" 的节点不存在,或者您在 xpath 中拼写错误。还要记住 xpaths 是区分大小写的。 以下语句可能会产生空值,因此可能会抛出异常。

row.SelectSingleNode("Varugrupp")

您可以通过如下更改 if 条件来绕过它

if (row.SelectSingleNode("Varugrupp")!=null && row.SelectSingleNode("Varugrupp").InnerText.StartsWith("Whisky"))
{
   var rowVarugrupp = (string)row.SelectSingleNode("Varugrupp").InnerText;
   sb.Varugrupp = rowVarugrupp;
}
第 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);
        }