用于最快查找的XML结构

时间:2012-02-24 12:14:26

标签: xml xslt data-structures

在下面的xml中查找某个“资源”时,下列结构中的一个或另一个是否更快?

样本1。


<root>
 <resource key="res_test_1" value="test"/>
 <resource key="res_test_2" value="test 2"/>
 <resource key="res_test_3" value="test 3"/>
</root>

样本2。


<root>
 <res_test_1>test</res_test_1>
 <res_test_2>test 2</res_test_2>
 <res_test_3>test 3</res_test_3>
</root>

“keys”始终是有效的XML元素名称。

我问,因为这组资源键/值将是xml文件的一部分,它将由XSL处理,用同一XML文件的资源部分中的值替换XML中的某些“键” ...我希望将资源部分尽可能地构建为所需的查找。 我正在使用C#和XslCompiledTransform对象来运行转换。

我的纯粹本能说当对象模型是实际的元素名称时,对象模型可能会更快到键,但我找不到关于这类问题的建议。也许考虑这个问题并不重要,因为整个xml文档在转换过程中会在内存中。

修改(从此处向下添加更多信息): 正如我已经指出的那样,这个问题可能是理论上的(关注几毫秒是不相关的),但输入这个问题的原因是为了得到我正在问的问题的意见 - 比其他问题快一点(在布局的两个样本中),在XML结构中定位数据时。出于任何原因,是一种或另一种是首选方式。

正如我所看到的,第一个样本需要为处理器提供更多的“工作”,以便在查询时找到并返回值。

这是示例1的示例XPath: /根/资源[@键= “res_test_2”] / @值

示例2的对应XPath: /根/ res_test_2

此外,样品2的结构需要较少的空间,这将改善加载时间,如下面的答案之一所示。这是一个很好的观点,至少对于非常大的文档而言。

当我想到它时:样本2的一个明显的缺点是XSD架构没有多大用处,因为这部分XML将具有动态元素名称..这可能是建议的将所有值放在属性中(见下面的答案)是关于。

我制作了这些XPath样本,因为它们很容易演示。我之前写过的XSL转换中需要类似的查找,但这个问题的重点应该是文档的结构,作为一个更通用的问题。

谢谢, 安德烈亚斯

2 个答案:

答案 0 :(得分:1)

不久前我问了一些关于XSLT性能的问题,我得到了以下答案:

使用属性而不是元素可以提高性能。执行XPath匹配时,属性更快,因为它们是松散类型的。这样可以更轻松地验证架构。

(见this question

答案 1 :(得分:0)

在sample1和sample2之间,唯一的区别是..你正在将元素转换为属性..读取子属性会花费与读取子元素相同的工作量。

示例:

<!--example1-->
<root>
  <child id="something"/>
</root>

<!--example2-->
<root>
  <child>
    <id>somthing</id>
  </child>
</root>

阅读的Xpath&#34; somthing&#34;从第一个例子来看 /root/child/@id/.和Xpath用于阅读/root/child/id/. ..

这并没有太大的区别..但是如果你看一下大小.. example2稍大..现在假设你有一个巨大的这样的节点列表..那么example2文件比example1更庞大..
所以example2数据重量很高

回到您的示例..如果您查看结构.. sample1看起来比sample2更长..
假设相同的文件具有相应层次的大量数据..
如果您尝试使用C#代码读取sample1和sample2 ..代码将花费更多时间来加载sample1(由于其大小)..与处理速度相比(我的意思是读取节点的过程)将是可忽略的。

@OP,如你所知......

XPath for Sample 1: /root/resource[@key="res_test_2"]/@value

Corresponding XPath for Sample 2: /root/res_test_2

Sample1肯定会降低1级...与Sample2相比..但正如我之前提到的那样..我发现这对解析器没什么影响,我已经解释过大小的影响< em>阅读文件 ..我想告诉你一些事情。
使用属性应该是明智的选择,它不是规则,但我们通常使用属性作为元数据 例如:

<root>
  <child id="1">some Data</child>
  <child id="2">Some other Data</child>
</root>

如果您查看上面的示例XML,属性,即&#34; ID&#34;用作关于子节点数据的元数据,Id不是数据,它只是一个子消息。


再举一个例子:

<html>
   <body>
       <div class="style1">Here is the display text.</div>
   </body>
</html>

以上示例只是一个HTML代码:)其中属性Class具有值&#34; style1&#34; ..然后在CSS文件中使用此类名称将属性和样式添加到标记下的文本