我正在尝试弄清楚如何在 XmlDocument
中找到字符串的所有匹配项。
XmlNodeList results
= document.SelectNodes("Products/Product/fn:matches(.,'" + SearchWord + "')");
我正在尝试比较 Product 的 innerText
。
虽然上面的例子不起作用,但我想我使用 XPath 函数的方式是非常错误的。
最佳答案
计算这个 XPath 1.0 表达式(您知道吗 matches()
是一个 XPath 2.0 函数,在 .NET 中不受支持):
Products/Product/descendant::*[contains(text(), 'YourSearchWord')]
这会选择所有具有包含字符串 'YourSearchWord'
的 text-node-child 并且是 Product
元素的后代的所有元素,该元素是 Product
元素的子元素Products
元素,它是当前(上下文)节点的子元素。
您可以用组成XPath表达式:
string.Format("Products/Product/descendant::*[contains(text(), '{0}')]",
SearchWord )
但是,如果 SearchWord
是从用户输入中获取的,建议不要像上面那样将其包含在骨架字符串中,这样可以避免 XPath 注入(inject)。
如果是这种情况,推荐的方法是有一个预编译的 XPath 表达式,其中用户输入将被引用为一个变量,这个变量的值将从 XPath 评估上下文中使用。
可以在这个答案中找到有关如何防止 XPath 注入(inject)的更多详细信息:
关于c# - XPath 查找所有匹配项 C# XmlDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9087893/