XPath显式索引过滤器性能

时间:2015-06-12 05:14:00

标签: c# xml performance xslt xpath

我正在创建一个xsl stylehseet并想出了这个(在我看来是不合逻辑的行为):

这个XPath:

  

/ root / element [1] [@ attr1!='1'或@ attr2!='test']

比这个XPath慢得多:

  

/ root / element [count(preceding-sibling :: element)+ 1 = 1)and(@ attr1!='1'或@ attr2!='test')]

我有50个样本xml,第一个XPath需要大约55秒 使用第二个XPath需要大约4秒!

我使用XslCompiledTransform(C#.NET 4.5)。

有人可以解释为什么第一个XPath比第二个慢得多吗?我一直认为最好使用显式索引过滤器。

更新: 一些示例xml:

<?xml version="1.0" encoding="iso-8859-1"?>
<root>
<element attr2="test" attr1="1">
    <child>17</child>
    <child>17</child>
    <child>16</child>
    ...
    <child>3</child>
    <child>2</child>
    <child>1</child>
</element>
<element attr2="test2" attr1="2">
    <child/>
    <child/>
    <child/>
    <child/>
    <child/>
    <child/>
    <child/>
    ...
    <child/>
</element>
....
<element attr2="test21" attr1="21" />

只有20-25个元素有n个子元素但深度最大值为4(/ root / element / child / anotherChild)。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,我必须接受这一点。 微软称https://support.microsoft.com/en-us/kb/815124

  

使用显式索引过滤器,所有版本的MSXML 3.0及更高版本都更快。性能的提高取决于父元素列表中元素的位置。而不是使用以下内容:

     

/ CHILD_ELEMENT

     

使用以下内容:

     

/ CHILD_ELEMENT [1]

就我而言,第一个例子比微软的推荐更快。