在下面的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转换中需要类似的查找,但这个问题的重点应该是文档的结构,作为一个更通用的问题。
谢谢, 安德烈亚斯
答案 0 :(得分:1)
不久前我问了一些关于XSLT性能的问题,我得到了以下答案:
使用属性而不是元素可以提高性能。执行XPath匹配时,属性更快,因为它们是松散类型的。这样可以更轻松地验证架构。
答案 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文件中使用此类名称将属性和样式添加到标记下的文本