C# 针对xsd和CRLF字符的Xml验证
我有一段代码,它根据XSD验证XMLC# 针对xsd和CRLF字符的Xml验证,c#,xml,xsd,xsd-validation,xml-validation,C#,Xml,Xsd,Xsd Validation,Xml Validation,我有一段代码,它根据XSD验证XML public void Validate() { XDocument xdoc = XDocument.Load("XML path"); var schemas = new XmlSchemaSet(); schemas.Add(null, "XSD path"); xdoc.Validate(schemas, ValidationCallBack); } p
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\n]*)
xml值标记是
<tagname> There is LF character here
</tagname>
这里有LF字符
它通过验证,但标记值仅具有尾随的“LF”字符。
它如何在xml验证中无效和失败?
请注意,我无法在xsd中修改此问题有几个有趣的方面 解析和验证XML文档是在一个技术堆栈中完成的,涉及解码、解析、转换为XML信息集(infoset)以及根据XML模式进行验证
- 在解析之前,XML规范说明(如果显示为CR LF,则删除),只留下LF字符。因此,解析器将不会看到任何CR字符,除非在某些情况下
- 转换为infoset时,文档元素外部出现的空白(包括LF)(这是我对问题中“拖尾”的理解:属性中也有拖尾空白的概念)被省略。因此,在构建文档的XML信息集时
- XML模式验证是针对上述信息集执行的,这意味着该模式也不会看到任何尾随空格
因此,检查实例中的尾部CR或LF字符(即使有意义)超出了架构验证的范围,应该在XML处理阶段之前使用其他工具完成。是否有有效的方法检查是否存在“CR”字符?您只能对未经分析的文档执行此检查。但是,既然XML规范说CR字符无论如何都会被忽略,你为什么要这样做呢?@MichaelKay check这篇文章被修改以获得更多澄清请不要在回答问题后更改它,它会变得非常混乱。您需要向我们展示您的模式,例如,我们需要了解空白方面是什么。建议您开始一个新问题,发布一个小的模式和源文档,让我们重现问题。