【问题标题】:XPath validation using Regex使用正则表达式进行 XPath 验证
【发布时间】:2014-04-21 21:05:39
【问题描述】:

尽可能详细地描述问题。 例如,我有 xml 文件:

<?xml version="1.0"?>
<root>
   <paths>
      <path>
         <file>
        <id>1</id>
        <name>example</name>
     </file>
     <options>
        <isreadonly>true</isreadonly>
     </options>
      </path>
   </paths>
</root>

还有 XPahts:

  • root/paths/path/file/id
  • 根目录/路径/路径/文件/名称
  • root/paths/path/options/isreadonly

如何使用正则表达式验证此路径?

我可以使用这个正则表达式验证一个 xml 元素名称 - ^(?!XML)[a-zA-Z][\w]*$,但我需要 String.Split(这个字符串),然后在循环中使用正则表达式.

这是xml元素名的命名规则:

  • 名称可以包含字母、数字和其他字符
  • 名称不能以数字或标点符号开头
  • 名称不能以字母 xml(或 XML、Xml 等)开头
  • 名称不能包含空格

无效路径:

  • xml/...
  • .../xmlang/...
  • .../1asdf/...
  • 1/.../...
  • .../_asdf/...等

谢谢。

【问题讨论】:

  • XPathExpression.Compile ?
  • 我需要一个简单的正则表达式字符串。我需要使用 [RegularExpression("")] 属性标记模型的属性,或者在客户端使用 java 脚本使用此正则表达式。

标签: c# xml regex validation xpath


【解决方案1】:

如果您打算在模型上标记一个属性,您只需创建一个自定义属性来检查表达式是否编译。 这将比尝试对其进行正则表达式容易得多。 因为正则表达式不是您要解析的工具 => https://softwareengineering.stackexchange.com/questions/113237/when-you-should-not-use-regular-expressions(请参阅已接受的答案)。

自定义属性可以如下:

public class MyCustomAttribute : ValidationAttribute {
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
     {
        //Your logic here.
        return ValidationResult.Success;
     }
}

【讨论】:

  • 我想知道该语言是否定义了 XPath 的语法是否规则?你有这方面的任何信息吗?
  • 你能重新表述你的问题吗?
  • 你对语言理论很熟悉吧?实际上,XPath 语法定义了一种语言,该语言确定给定字符串是否属于该语言,换句话说,它确定它是否可以被视为有效的 Xpath。只有当语言是正则时,我们才能编写生成相同语言的正则表达式,否则我们不能。例如,如果语言是上下文无关语言,我们只使用解析器来描述它,并且没有办法使用正则表达式来定义它。所以我的问题是你知道Xpath语法语言属于什么类吗?
  • 我对 JsonPath 语法有同样的疑问,因为这两种语法有很多共同点
  • 在我看来,两者都不规则,只能由解析器解析。尽管如此,在它们上使用正则表达式并非不可能,就像对 HTML 做同样的事情一样。这只是大多数人会皱眉头的事情。
最近更新 更多