针对 xsd 和 CRLF 字符的 XML 验证



我有这段代码,可以针对XSD验证XML。

public void Validate()
{
XDocument xdoc = XDocument.Load("XML path");
var schemas = new XmlSchemaSet();
schemas.Add(null, "XSD path");
xdoc.Validate(schemas, ValidationCallBack);
}
private void ValidationCallBack(object sender, ValidationEventArgs args)
{
if (args.Severity != XmlSeverityType.Error) 
return;
throw new XmlSchemaValidationException(args.Message);
}

如果我在 xsd 中有一个字符串类型的元素并且具有模式 ([^\t\r]*( 而 xml 值标签是

<tagname> There is LF character here
</tagname>

它从验证传递,但标签值只有尾随的"LF"字符。 它应该如何无效并在 xml 验证中失败? 请注意,我无法在 xsd 中修改

这个问题有几个有趣的方面。

解析和验证 XML 文档是在涉及解码、解析、转换为 XML 信息集(信息集(以及针对 XML 架构进行验证的技术堆栈中完成的。

  • 在解析之前,XML 规范规定任何 CR 字符都替换为 LF 字符(如果显示为 CR LF 则删除(,只留下 LF 字符。因此,解析器将看不到任何 CR 字符,除非在某些极端情况下。

  • 转换为 infoset 时,省略了出现在文档元素外部的空格(包括 LF((这是我对问题中"尾随"的理解:属性中还有尾随空格的概念(。因此,在生成文档的 XML 信息集后,不会留下有关尾随空格的信息。

  • XML 架构验证是针对上述信息集执行的,这意味着架构也不会看到任何尾随空格。

因此,检查实例中的尾随 CR 或 LF 字符(即使确实有意义(超出了架构验证的范围,应在 XML 处理阶段之前使用其他工具完成。

最新更新