我有一个大的XML文件,我必须用XmlReader读取它,因为它无法加载到内存中。此XML以这种方式格式化(是简化版本):
Label
请注意<?xml version="1.0" encoding="windows-1252"?>
<Products>
<Product>
<Code>A14</Code>
<Name>Name1</Name>
<Manufacturer>
<Name>ManufacturerName</Name>
</Manufacturer>
<ProdCategories>
<ProdCategory>
<Code>015</Code>
<Name>ProdCategoryName</Name>
</ProdCategory>
</ProdCategories>
<Barcodes> <!-- note this line -->
</Barcodes>
</Product>
<Product>
<Code>A15</Code>
<Name>Name2</Name>
<Manufacturer>
<Name>ManufacturerName</Name>
</Manufacturer>
<ProdCategories>
<ProdCategory>
<Code>016</Code>
<Name>ProdCategoryName</Name>
</ProdCategory>
</ProdCategories>
<Barcodes>
<Barcode>
<Code>1234567890</Code> <!-- note this line -->
</Brcode>
</Barcodes>
</Product>
<Barcode>
元素:缺少第一个<Code>
。
这是我用来读取它并将这些数据放入数据库的代码:
<product>
除 XmlReader reader = XmlReader.Create("Products.xml");
reader.MoveToContent();
do
{
reader.ReadToFollowing("Code");
code = reader.ReadElementContentAsString();
reader.ReadToFollowing("Name");
Name = reader.ReadElementContentAsString();
reader.ReadToFollowing("Name");
ManufacturerName = reader.ReadElementContentAsString();
reader.ReadToFollowing("Code");
ProdCategoryCode = reader.ReadElementContentAsString();
reader.ReadToFollowing("Code");
BarcodeCode = reader.ReadElementContentAsString();
//Here I use "code", "Name", "ManufacturerName" variables to insert into a database
} while (reader.Read());
reader.Close();
子项(<Barcodes>
)之外的所有产品中都存在所有XML标记,这些标记只出现在某些产品上,然后我无法跳到下一个&#34; code&#34;最后<Barcode><Code>
,因为如果不存在,我会捕获第一个ReadToFollowing
。
我无法控制XML输出并且无法修改它(是第三方)。
通过&#34; <product><code>
&#34;所以我可以具体说明应该寻找什么,如果没有找到我可以跳过它?
感谢您的帮助,原谅我的英语不好。
答案 0 :(得分:0)
我建议使用https://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom(v=vs.110).aspx或https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.readnode(v=vs.110).aspx将每个Product
元素拉入树模型,然后您可以使用LINQ to XML查询方法或XPath来读取数据每个Product
以安全的方式保持低内存占用。