【问题标题】:XmlDocment - how to get nodes by filtering using XPathXmlDocument - 如何通过使用 XPath 过滤来获取节点
【发布时间】:2011-05-24 03:58:04
【问题描述】:

如果您有一个 XML 文档,并且需要根据某些属性值(数量为 4)找到某些节点,那么哪种方法是正确的(就性能而言):-

a) 过滤 XML 文档(使用XPath)以获取匹配任何属性值的节点列表,然后遍历过滤的节点列表以使用 If-else 获取具有特定属性值的节点。

b) 分别为每个属性值过滤 XML 文档(使用XPath)。

<Nodes>
  <a class="myclass" type="type1">some text</a>
  <a class="myclass" type="type2">some text</a>
  <img src = "myGraphic.jpg?id={Guid}"/>
</Nodes>

我正在使用以下 XPath(可能不正确:-))

"//A[@class] | //a[@class] | //IMG[@src] | //img[@src]"

目标是在 img 标记中获取所有具有 type="type1" 的单独列表、type="type2" 的单独列表和 id 的单独列表。

【问题讨论】:

  • 请举例说明您的意思。不清楚为什么不只使用单个 XPath 表达式一次查找所有节点。
  • “为什么你不只使用单个 XPath 表达式” - 这是问题中的 a) 选项。一次获取所有节点后,需要输入 If-else 以获取每种属性值的节点值。这是一个好方法吗。添加了一个示例。
  • @user:慢慢来。它不必是您的真实 XML 的副本。只是显示您对属性值的意思的东西。例如,我不明白你为什么需要 if/else。
  • 约翰,添加了一个例子。
  • @user:好的,现在你要匹配哪些 XML 节点?

标签: c# xpath xmldocument


【解决方案1】:

我的粗略回答是,除非您有一个非常大的文档或一组文档,否则性能并不重要。

在这种情况下,您可能希望使用 SAX,并且无论如何,您都希望只遍历文档一次,而不是将整个文档保存在内存中。因此,您将在文档中进行流式传输,在每个 a 元素处停止,并根据其类型将其附加到 list1 或 list2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多