2017-08-17 89 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