C# 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

你好

我正在用C#Net写一个程序来管理我商店的产品

根据给定的链接,我可以检索一个XML文件,其中包含我可以在店面上列出的所有可能的产品

XML结构如下所示:

<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文件有多大?顺便说一句,您可以将
    node.ChildNodes[i].Name
    放入交换机;如果已经找到匹配项,则无需多次检查名称。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()