C# XML的高效解析
你好 我正在用C#Net写一个程序来管理我商店的产品 根据给定的链接,我可以检索一个XML文件,其中包含我可以在店面上列出的所有可能的产品 XML结构如下所示:C# XML的高效解析,c#,xml,optimization,C#,Xml,Optimization,你好 我正在用C#Net写一个程序来管理我商店的产品 根据给定的链接,我可以检索一个XML文件,其中包含我可以在店面上列出的所有可能的产品 XML结构如下所示: <Product StockCode="103-10440"> <lastUpdated><![CDATA[Fri, 20 May 2016 17:00:03 GMT]]></lastUpdated> <StockCode><![CDATA[103-104
<Product StockCode="103-10440">
<lastUpdated><![CDATA[Fri, 20 May 2016 17:00:03 GMT]]></lastUpdated>
<StockCode><![CDATA[103-10440]]></StockCode>
<Brand><![CDATA[3COM]]></Brand>
<BrandID><![CDATA[14]]></BrandID>
<ProdName><![CDATA[BIG FLOW BLOWING JUNCTION FLEX BLOCK, TAKES 32, 40]]> </ProdName>
<ProdDesc/>
<Categories>
<TopCat><![CDATA[Accessories]]></TopCat>
<TopCatID><![CDATA[24]]></TopCatID>
</Categories>
<ProdImg/>
<ProdPriceExclVAT><![CDATA[30296.79]]></ProdPriceExclVAT>
<ProdQty><![CDATA[0]]></ProdQty>
<ProdExternalURL><![CDATA[http://pinnacle.eliance.co.za/#!/product/4862]]></ProdExternalURL>
</Product>
以下是我正在寻找的条目:
- 最近更新
- 股票代码
- 烙印
- ProdName
- 产品描述
- 对于大型XML文件,您必须使用XmlReader。下面的代码将一次读取一个产品
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { XmlReader reader = XmlReader.Create("filename"); while(!reader.EOF) { if (reader.Name != "Product") { reader.ReadToFollowing("Product"); } if (!reader.EOF) { XElement product = (XElement)XElement.ReadFrom(reader); string lastUpdated = (string)product.Element("lastUpdated"); } } } } }
对于大型XML文件,必须使用XmlReader。下面的代码将一次读取一个产品using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { XmlReader reader = XmlReader.Create("filename"); while(!reader.EOF) { if (reader.Name != "Product") { reader.ReadToFollowing("Product"); } if (!reader.EOF) { XElement product = (XElement)XElement.ReadFrom(reader); string lastUpdated = (string)product.Element("lastUpdated"); } } } } }
这里有点可疑。这不需要10秒。你是一个人计时的吗?这个XML文件有多大?顺便说一句,您可以将
放入交换机;如果已经找到匹配项,则无需多次检查名称。XML文件大约有82k行,文件大小为3.2MB-我正在从web链接检索所述文件。请分别记录下载所需的时间和解析文件所需的时间xml@KazutoKirigaya我只是使用XElement.Load(“文件名”)加载一个1.2GB的文件在不到一分钟的时间里,速度慢的部分很可能是下载部分,而不是解析部分。82kb是“非常非常小”在今天的术语中,我建议使用linq to XML(XElement/XDocument)代替旧的XmlDocument对象。请听人们的声音,在使用XmlReader重写之前(这有助于内存消耗,在解析性能方面很少见),找出当前代码速度慢的真正原因。这里有些可疑。这不需要10秒。你是一个人计时的吗?这个XML文件有多大?顺便说一句,您可以将node.ChildNodes[i].Name
放入交换机;如果已经找到匹配项,则无需多次检查名称。XML文件大约有82k行,文件大小为3.2MB-我正在从web链接检索所述文件。请分别记录下载所需的时间和解析文件所需的时间xml@KazutoKirigaya我只是使用XElement.Load(“文件名”)加载一个1.2GB的文件在不到一分钟的时间里,速度慢的部分很可能是下载部分,而不是解析部分。82kb在今天的术语中是“非常非常小”的,我建议使用linq to XML(XElement/XDocument)代替旧的XmlDocument对象。在使用XmlReader重写之前,请先倾听人们的声音(这有助于内存消耗,在解析性能方面很少见)-找到当前代码速度慢的真正原因。3MB不是太大IMO@jdweng,这是最有效的方法吗我将用这个替换我当前的解决方案,并对其进行测试。@jdweng,如果这是一个简单的问题,很抱歉,但是我如何获取我想要获取的嵌套属性(TopCat)-它与其他解决方案相同吗?代码行不多。当读取多个3MB文件时,将开始使用大量内存,并最终开始减慢速度。我的代码一次读取一个元素确实需要大量内存。唯一可以确定的是通过测量时间来执行台架测试。使用子体而不是元素:product.substands(“TopCat”).FirstOrDefault()和product.substands(“TopCatID”)。FirstOrDefault()3 MB不是太大IMO@jdweng,这是最有效的方法吗我将用这个替换我当前的解决方案,并对其进行测试。@jdweng,如果这是一个简单的问题,很抱歉,但是我如何获取我想要获取的嵌套属性(TopCat)-它与其他解决方案相同吗?代码行不多。当读取多个3MB文件时,将开始使用大量内存,并最终开始减慢速度。我的代码一次读取一个元素确实需要大量内存。唯一可以确定的是通过测量时间来执行台架测试。请使用子体而不是元素:product.substands(“TopCat”).FirstOrDefault()和product.substands(“TopCatID”).FirstOrDefault()node.ChildNodes[i].Name