将xml文档拆分为块
我有一个大型的xml文档,需要一次处理100条记录
它是在用c#编写的Windows服务中完成的。
结构如下:
2008-10-13 050758023 sddsf dsfd sdf sdfsdd sdfdsfdf dffddf 2008-10-13 050758023 sddsf dsfd sdf sdfsdd sdfdsfdf dffddf ..... .....
在一个案卷中可能会有成千上万的订单。
我需要将其切成100个元素块
但是,100个订单中的每一个仍然需要用父“docket”节点包装并具有相同的命名空间等
这可能吗?
另一种天真的解决方案 这次适用于.NET 2.0。 它应该让你知道如何去做你想要的。 使用Xpath表达式而不是Linq to XML。 在我的开发箱上,在一秒钟内将100个订单分成10个小册子。
public List ChunkDocket(XmlDocument docket, int chunkSize) { List newDockets = new List (); // int orderCount = docket.SelectNodes("//docket/order").Count; int chunkStart = 0; XmlDocument newDocket = null; XmlElement root = null; XmlNodeList chunk = null; while (chunkStart < orderCount) { newDocket = new XmlDocument(); root = newDocket.CreateElement("docket"); newDocket.AppendChild(root); chunk = docket.SelectNodes(String.Format("//docket/order[position() > {0} and position() <= {1}]", chunkStart, chunkStart + chunkSize)); chunkStart += chunkSize; XmlNode targetNode = null; foreach (XmlNode c in chunk) { targetNode = newDocket.ImportNode(c, true); root.AppendChild(targetNode); } newDockets.Add(newDocket); } return newDockets; }
天真,迭代,但工作[编辑:仅在.NET 3.5]
public List ChunkDocket(XDocument docket, int chunkSize) { var newDockets = new List (); var d = new XDocument(docket); var orders = d.Root.Elements("order"); XDocument newDocket = null; do { newDocket = new XDocument(new XElement("docket")); var chunk = orders.Take(chunkSize); newDocket.Root.Add(chunk); chunk.Remove(); newDockets.Add(newDocket); } while (orders.Any()); return newDockets; }
如果一次处理100个订单的原因是出于性能目的,例如花费太多时间和资源来打开大文件,您可以利用XmlReader一次处理一个订单元素,而不会降低性能。
XmlReader reader = XmlReader.Create(@"c:\foo\Doket.xml") while( reader.Read()) { if(reader.LocalName == "order") { // read each child element and its value from the reader. // or you can deserialize the order element by using a XmlSerializer and Order class } }