2017-08-17 66 views
2

我已经这段代码,用于验证XML对XSDXML验证

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元素具有与字符串类型,并且具有图案([^ \吨\ r \ n]的*) 和XML值标签是

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

它从验证然而标签值仅尾随“LF”字符通过。 它应该如何无效,并在xml验证失败? 请注意,我无法修改xsd

回答

4

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

解析和验证XML文档是在涉及解码,解析,转换为XML信息集(信息集)和根据XML模式进行验证的技术堆栈中完成的。

  • 解析之前,XML规范指出,(如果显示为CR LF去除或)any CR characters are replaced with LF characters,只留下LF字符。因此解析器将看不到任何CR字符,除非在某些角落情况下。

  • 当转换到信息集时,省略了出现在文档元素之外的空白(包括LF)(这是我对问题中“尾随”的理解:也有属性中尾随空白的概念)。因此,在构建文档的XML信息集时,there is no information left about trailing white space

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

检查的情况后CR或LF字符,即使它有一定道理,因此架构验证的范围,应与领先的XML处理阶段的其他工具来完成。

+0

是否有任何有效的方法来检查是否有'CR'字符? – Sumthg

+0

您只能对未解析的文档进行此项检查。但是为什么你想要,因为XML规范说CR字符被忽略了? –

+0

@MichaelKay检查帖子被修改为更多的澄清 – Sumthg