我有这段代码,可以针对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 处理阶段之前使用其他工具完成。