XmlReader如何读取或跳过并不总是存在的特定子项

时间:2016-09-23 09:27:53

标签: asp.net xml xmlreader

我有一个大的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;所以我可以具体说明应该寻找什么,如果没有找到我可以跳过它?

感谢您的帮助,原谅我的英语不好。

1 个答案:

答案 0 :(得分:0)

我建议使用https://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom(v=vs.110).aspxhttps://msdn.microsoft.com/en-us/library/system.xml.xmldocument.readnode(v=vs.110).aspx将每个Product元素拉入树模型,然后您可以使用LINQ to XML查询方法或XPath来读取数据每个Product以安全的方式保持低内存占用。