c# - 使用 XMLReader 解析大 XML 文件
问题描述
我有一个非常大的 xml 文件,格式如下
<ABC>
<NAMEDETAILS></NAMEDETAILS>
<PRODUCT>
<PRODUCTDETAILS>
<ProductName>
<name>Car</Name>
<name>lorry<name>
<name>Car<name>
</ProductName>
</PRODUCTDETAILS>
<PRODUCTDETAILS>
<ProductName>
<name>van</Name>
<name>cycle</Name>
<name>bus</Name>
</ProductName>
</PRODUCTDETAILS>
<PRODUCTDETAILS>
<ProductName>
<name>car</Name>
<name>cycle</Name>
<name>bus</Name>
</ProductName>
</PRODUCTDETAILS>
<PRODUCT>
</ABC>
我想检索名称标签值为“car”的 PRODUCTDETAILS 数据并将其保存在新的 xml 文件中。我正在使用 XMLReader,但我一直在前进。有人可以帮助我。下面是c#代码
XMLReader xmlReader = XMLReader.Create(@"\\Drive\xmlfile.xml")
while (xmlReader.Read())
{
If (xmlReader.NodeType == XMLNodeType.Element) && (xmlReader.Name == "PRODUCTDETAILS")
{
xmlReader.ReadtoDescendant("ProductName")
}
}
解决方案
using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
namespace ConApp1
{
class Program
{
static void Main()
{
using (var xmlWriter = XmlWriter.Create("result.xml"))
using (var xmlReader = XmlReader.Create("test.xml"))
{
xmlWriter.WriteStartElement("PRODUCT");
while (xmlReader.ReadToFollowing("PRODUCTDETAILS"))
{
using (var nodeReader = xmlReader.ReadSubtree())
{
nodeReader.MoveToContent();
var elem = (XElement)XNode.ReadFrom(nodeReader);
var name = elem.Descendants("name").First().Value;
if (name.Equals("car", StringComparison.OrdinalIgnoreCase))
{
elem.WriteTo(xmlWriter);
}
}
}
}
}
}
}
既然你说文件很大,那么读写都应该使用流式工具来完成。XmlWriter
用于书写。这保证了低内存消耗并且不会OutOfMemoryException
发生。
推荐阅读
- c - do_crypt() 中的分段错误
- ansible - ansible delegate_to 运行多次
- typescript - Typescript 忽略类类型定义上的修饰 mobx 属性
- tidymodels - 如何确定 Ranger 中哪些列名是非法的?
- corda - 如何正确地使 NonFungibleToken 的唯一性
- django - 如何让用户使用 Django Rest Framework 保持登录状态?
- c# - Azure Pipelines 选项内部版本号:$(Rev:r) 是否在每次构建时增加?
- c# - 我的活动中有两个按钮,单击其中两个应该取消突出显示另一个
- linux - 如何制定将源代码存储在备份目录中的makefile规则?
- plot - 如何在 Scilab 中沿 x 轴旋转绘图?