检查XML是否满足用户提供的谓词

时间:2011-02-02 04:30:05

标签: .net xml xpath xml-namespaces

来自Declare namespaces within XPath expression

简化任务:

  • 有许多具有命名空间的不同结构的XML文件
  • 用户以文本形式定义了几个表达式
  • 表达式应用于每个XML文件,给出结果:是或否

在不使用第三方库的情况下,我应该使用什么技术来完成.NET 3.5 中的此任务?

考生:

  • 的XPath。 不是首选的情况,因为没有简单的方法在XPath表达式中指定名称空间
  • ...

更新

我已经意识到实际上问题是:除了XPath之外还有办法吗?

Schematron是目前唯一的建议。

3 个答案:

答案 0 :(得分:1)

  

简化任务:

     

•有很多XML文件   具有命名空间的不同结构

     

•用户在a中定义了几个谓词   文本表格

     

•应用谓词   给每个给出结果的XML文件:   是或否

目前尚不清楚上述说明中“谓词”一词的含义。

我认为这意味着:“评估为布尔值的XPath表达式

如果是这样,可以使用例如 XPathNavigator.Evaluate(XPathExpression)

评估每个这样的个体表达式

使用不同命名空间的不同用户的问题需要集中解决方案。我建议的一种方法是创建命名空间前缀的中心目录并将其发布到命名空间映射,以便表达式作者只应使用此目录中的前缀。在评估任何XPath表达式之前,所有这些前缀都将绑定到相应的名称空间。 .NET类XmlNamespaceManager非常适合此目的。如何将XmlNamespaceManagerXpathNavigator.Evaluate()XPathNavigator.Select()一起使用的示例可以找到here

非常重要:永远不要评估包含XPath表达式的字符串 - 这可能会导致 XPath injection 。始终编​​译字符串(例如,使用 XPathExpression.Compile ())。即使遵守此类规则,评估用户提供的XPath表达式也可能导致安全风险。

答案 1 :(得分:1)

约束“不使用第三方库”似乎很奇怪:如今大多数人都试图最大化代码重用。

没有这种限制,我会说Schematron就是答案。它完全符合您的要求。

使用XSLT样式表定义验证规则也可以达到相同的效果 - 但最终重新发明了Schematron。

答案 2 :(得分:0)

如果名称空间是“问题”,您可以随时:

  1. 使用修改后的身份转换预处理XML文件,以生成包含未绑定到特定命名空间的节点的XML文件
  2. 然后根据修改后的XML评估用户提供的XPATH
  3. 返回结果
  4. 请注意,虽然这会使XPATH创建和评估更简单,但它完全避免了命名空间的原因,可能会从另一个命名空间获得元素/属性的模糊匹配,并返回结果不正确