我正在尝试通过URl读取3GB的XML文件,并将所有作业存储在数据集中。 XML看起来像这样:
<?xml version="1.0"?>
<feed total="1621473">
<job>
<title><![CDATA[Certified Medical Assistant]]></title>
<date>2016-03-25 14:19:38</date>
<referencenumber>2089677765</referencenumber>
<url><![CDATA[http://www.jobs2careers.com/click.php?id=2089677765.1347]]></url>
<company><![CDATA[Broadway Medical Clinic]]></company>
<city>Portland</city>
<state>OR</state>
<zip>97213</zip>
</job>
<job>
<title><![CDATA[Certified Medical Assistant]]></title>
<date>2016-03-25 14:19:38</date>
<referencenumber>2089677765</referencenumber>
<url><![CDATA[http://www.jobs2careers.com/click.php?id=2089677765.1347]]></url>
<company><![CDATA[Broadway Medical Clinic]]></company>
<city>Portland</city>
<state>OR</state>
<zip>97213</zip>
</job>
</feed>
这是我的代码
XmlDocument doc = new XmlDocument();
doc.Load(url);
DataSet ds = new DataSet();
XmlNodeReader xmlReader = new XmlNodeReader(doc);
while (xmlReader.ReadToFollowing("job"))
{
ds.ReadXml(xmlReader);
}
但是我的记忆超出了约束。浏览谷歌 并发现了这个:
DataSet ds = new DataSet();
FileStream filestream = File.OpenRead(url);
BufferedStream buffered = new BufferedStream(filestream);
ds.ReadXml(buffered);
仍然是同样的例外。我也读过关于XmlTextReader但我不知道如何在我的情况下使用它。 我知道为什么我会得到例外,但我不知道如何克服这一点。谢谢
答案 0 :(得分:1)
不是试图将整个文件加载到DataSet或其他容器中,而是如何加载批次并将每个批次写入数据库,以便每次都可以清除保存批次的任何内容?
如何:执行大型XML文档的流式转换 https://msdn.microsoft.com/en-us/library/bb387013.aspx
List<XElement> jobs = new List<XElement>();
using (XmlReader reader = XmlReader.Create(filePath))
{
XElement job;
reader.MoveToContent();
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "job"))
{
job = XElement.ReadFrom(reader) as XElement;
jobs.Add(job);
if (jobs.Count >= 1000)
{
// TODO: write batch to database
jobs.Clear();
}
}
}
if (jobs.Count > 0)
{
// TODO: write remainder to database
jobs.Clear();
}
}
使用DataSet的替代方案。
DataSet ds = new DataSet();
using (XmlReader reader = XmlReader.Create(filePath))
{
reader.MoveToContent();
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "job"))
{
ds.ReadXml(reader);
DataTable dt = ds.Tables["job"];
if (dt.Rows.Count >= 1000)
{
// TODO: write batch to database
dt.Rows.Clear();
}
}
}
if (ds.Tables["job"].Rows.Count > 0)
{
// TODO: write remainder to database
ds.Tables["job"].Rows.Clear();
}
}
答案 1 :(得分:0)
doc.Load()将读取整个文件并给出错误。 XmlNodeReader不会为你做任何事情。试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
const string url = @"c:\temp\test.xml";
static void Main(string[] args)
{
int count = 0;
DataSet ds = new DataSet();
XmlReader xmlReader = XmlReader.Create(url);
xmlReader.MoveToContent();
try
{
while (!xmlReader.EOF)
{
count++;
xmlReader.ReadToFollowing("job");
if (!xmlReader.EOF)
{
ds.ReadXml(xmlReader);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Count : {0}", count);
Console.ReadLine();
}
}
}
}