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