来自Declare namespaces within XPath expression
简化任务:
在不使用第三方库的情况下,我应该使用什么技术来完成.NET 3.5 中的此任务?
考生:
更新
我已经意识到实际上问题是:除了XPath之外还有办法吗?
Schematron是目前唯一的建议。
答案 0 :(得分:1)
简化任务:
•有很多XML文件 具有命名空间的不同结构
•用户在a中定义了几个谓词 文本表格
•应用谓词 给每个给出结果的XML文件: 是或否
目前尚不清楚上述说明中“谓词”一词的含义。
我认为这意味着:“评估为布尔值的XPath表达式”
如果是这样,可以使用例如 XPathNavigator.Evaluate(XPathExpression)
评估每个这样的个体表达式使用不同命名空间的不同用户的问题需要集中解决方案。我建议的一种方法是创建命名空间前缀的中心目录并将其发布到命名空间映射,以便表达式作者只应使用此目录中的前缀。在评估任何XPath表达式之前,所有这些前缀都将绑定到相应的名称空间。 .NET类XmlNamespaceManager
非常适合此目的。如何将XmlNamespaceManager
与XpathNavigator.Evaluate()
和XPathNavigator.Select()
一起使用的示例可以找到here。
非常重要:永远不要评估包含XPath表达式的字符串 - 这可能会导致 XPath injection 。始终编译字符串(例如,使用 XPathExpression.Compile ())。即使遵守此类规则,评估用户提供的XPath表达式也可能导致安全风险。
答案 1 :(得分:1)
约束“不使用第三方库”似乎很奇怪:如今大多数人都试图最大化代码重用。
没有这种限制,我会说Schematron就是答案。它完全符合您的要求。
使用XSLT样式表定义验证规则也可以达到相同的效果 - 但最终重新发明了Schematron。
答案 2 :(得分:0)
如果名称空间是“问题”,您可以随时:
请注意,虽然这会使XPATH创建和评估更简单,但它完全避免了命名空间的原因,可能会从另一个命名空间获得元素/属性的模糊匹配,并返回结果不正确。