首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >就性能而言,哪一个是最好的: XPathNavigator与XPath和?

问就性能而言,哪一个是最好的: XPathNavigator与XPath和?
EN

Stack Overflow用户
提问于 2011-12-16 06:04:28
回答 2查看 7.5K关注 0票数 6

我有一个应用程序,在这个应用程序中,我使用XPathNavigator迭代节点。它很好用。

但我想知道如果我使用..。

  1. 我会得到什么好处(性能,可维护性)?
  2. 对于XPath,LINQ性能的影响是什么?

我使用的是C#.net,VS 2010,我的.xml是中型的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-16 08:53:31

嗯,XPathNavigator通常比Linq to XML查询更快。但总有“但是”。

Linq to XML肯定会使您的代码更具可读性和可维护性。阅读linq查询(至少对我来说)更容易,然后分析XPath。此外-在编写查询时,您将获得intellisense,这将有助于使您的代码正确。如果需要的话,Linq to XML还提供了轻松修改数据的可能性。XPathNavigator允许您进行只读访问。

另一方面,如果您真的需要最好的性能,XPathNavigator可能是前进的道路。这仅仅取决于您当前的场景和您想要完成的任务。如果性能不是问题(XML相当小,您不会对这个文件提出很多请求等等),那么您可以很容易地使用Linq to XML。否则,要紧挨着XPathNavigator。

票数 4
EN

Stack Overflow用户

发布于 2013-05-26 15:18:50

为了补充这里已经说明的内容,总体性能似乎取决于您实际对所讨论的文档做了什么。这就是我根据比较XElement和XPathNavigator之间解析性能的简单实验结果得出的结论。

如果选择节点,遍历这些节点并读取某些属性值:

  • XElement.Element比XElement.CreateNavigator.Select快1.5倍。
  • XElement.CreateNavigator.Select比XPathNavigator.Select快0.5倍。
  • XPathNavigator.Select比XElement.XPathSelectElement快0.5倍。

另一方面,如果您还在读取每个节点的子节点的值,则会有一些有趣的内容:

  • XElement.Element比XElement.XPathSelectElements快0.5倍。
  • XElement.XPathSelectElement比XPathNavigator.Select快3倍。
  • XPathNavigator.Select比XElement.CreateNavigator.Select快0.5倍。

这些结论是根据下列守则得出的:

代码语言:javascript
复制
 [Test]
    public void CompareXPathNavigatorToXPathSelectElement()
    {     
        var max = 100000;

        Stopwatch watch = new Stopwatch();
        watch.Start();

        bool parseChildNodeValues = true;

        ParseUsingXPathNavigatorSelect(max, watch, parseChildNodeValues);
        ParseUsingXElementElements(watch, max, parseChildNodeValues);
        ParseUsingXElementXPathSelect(watch, max, parseChildNodeValues);
        ParseUsingXPathNavigatorFromXElement(watch, max, parseChildNodeValues);
    }

    private static void ParseUsingXPathNavigatorSelect(int max, Stopwatch watch, bool parseChildNodeValues)
    {
        var document = new XPathDocument(@"data\books.xml");
        var navigator = document.CreateNavigator();

        for (var i = 0; i < max; i++)
        {
            var books = navigator.Select("/catalog/book");
            while (books.MoveNext())
            {
                var location = books.Current;
                var book = new Book();
                book.Id = location.GetAttribute("id", "");

                if (!parseChildNodeValues) continue;

                book.Title = location.SelectSingleNode("title").Value;
                book.Genre = location.SelectSingleNode("genre").Value;
                book.Price = location.SelectSingleNode("price").Value;
                book.PublishDate = location.SelectSingleNode("publish_date").Value;
                book.Author = location.SelectSingleNode("author").Value;
            }
        }

        watch.Stop();
        Console.WriteLine("Time using XPathNavigator.Select = " + watch.ElapsedMilliseconds);
    }

    private static void ParseUsingXElementElements(Stopwatch watch, int max, bool parseChildNodeValues)
    {
        watch.Restart();
        var element = XElement.Load(@"data\books.xml");

        for (var i = 0; i < max; i++)
        {
            var books = element.Elements("book");
            foreach (var xElement in books)
            {
                var book = new Book();
                book.Id = xElement.Attribute("id").Value;

                if (!parseChildNodeValues) continue;

                book.Title = xElement.Element("title").Value;
                book.Genre = xElement.Element("genre").Value;
                book.Price = xElement.Element("price").Value;
                book.PublishDate = xElement.Element("publish_date").Value;
                book.Author = xElement.Element("author").Value;
            }
        }

        watch.Stop();
        Console.WriteLine("Time using XElement.Elements = " + watch.ElapsedMilliseconds);
    }

    private static void ParseUsingXElementXPathSelect(Stopwatch watch, int max, bool parseChildNodeValues)
    {
        XElement element;
        watch.Restart();
        element = XElement.Load(@"data\books.xml");

        for (var i = 0; i < max; i++)
        {
            var books = element.XPathSelectElements("book");
            foreach (var xElement in books)
            {
                var book = new Book();
                book.Id = xElement.Attribute("id").Value;

                if (!parseChildNodeValues) continue;

                book.Title = xElement.Element("title").Value;
                book.Genre = xElement.Element("genre").Value;
                book.Price = xElement.Element("price").Value;
                book.PublishDate = xElement.Element("publish_date").Value;
                book.Author = xElement.Element("author").Value;
            }
        }

        watch.Stop();
        Console.WriteLine("Time using XElement.XpathSelectElement = " + watch.ElapsedMilliseconds);
    }

    private static void ParseUsingXPathNavigatorFromXElement(Stopwatch watch, int max, bool parseChildNodeValues)
    {
        XElement element;
        watch.Restart();
        element = XElement.Load(@"data\books.xml");

        for (var i = 0; i < max; i++)
        {
            // now we can use an XPath expression
            var books = element.CreateNavigator().Select("book");

            while (books.MoveNext())
            {
                var location = books.Current;
                var book = new Book();
                book.Id = location.GetAttribute("id", "");

                if (!parseChildNodeValues) continue;

                book.Title = location.SelectSingleNode("title").Value;
                book.Genre = location.SelectSingleNode("genre").Value;
                book.Price = location.SelectSingleNode("price").Value;
                book.PublishDate = location.SelectSingleNode("publish_date").Value;
                book.Author = location.SelectSingleNode("author").Value;
            }
        }

        watch.Stop();
        Console.WriteLine("Time using XElement.Createnavigator.Select = " + watch.ElapsedMilliseconds);
    }

使用books.xml从这里下载

总的来说,如果您的文档有点平坦,那么XElement解析API (不包括XPath扩展)提供了最好的性能,同时也更容易使用。如果有深层次的嵌套结构,则必须执行以下操作

代码语言:javascript
复制
XElement.Element("book").Element("author").Element("firstname").SomethingElse()

然后,XElement.XPathSelectElement可以在性能和代码可维护性之间提供最佳的折衷方案。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8530416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档