2013-06-21 88 views
2

我有沒有定義任何目標名稱空間模式文件,即它的定義是這樣的:XDocument.Validate總是成功

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <!--Elements, attributes, etc. --> 
</xs:schema> 

相應的XML看起來是這樣的:

<Documents p1:CRC="0" p1:Date="1900-01-01T01:01:01+01:00" p1:Name="Test" p1:Status="new" xmlns:p1="http://www.tempuri.org/pdms.xsd" xmlns="http://www.tempuri.org/pdms.xsd"> 
    <p1:Document p1:Date="2010-12-23T07:59:45" p1:ErrorCode="0" p1:ErrorMessage="" p1:Number="TEST00001" p1:Status="new"/> 
</Documents> 

使用例如,針對模式驗證此XML Altova XMLSpy或Oxygen XML Editor失敗。

但是我在C#(.NET 4.0)中的驗證不會失敗。 XML被處理爲XDocument對象。如果我理解正確,那麼XDocument.Validate()會在模式中找不到名稱空間的情況下執行寬鬆驗證。因此驗證不會失敗。但是,我怎樣才能對XDocument執行「嚴格」驗證?

這是我嘗試驗證XML:

public static void ValidateXml(XDocument xml, string xsdFilename) { 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    XmlSchemaSet schemaSet = new XmlSchemaSet(); 

    schemaSet.Add(string.empty, xsdFilename); 
    settings.ValidationType = ValidationType.Schema; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); 

    xml.Validate(schemaSet, ValidationCallback); 
} 

private static void ValidationCallback(object sender, ValidationEventArgs args) { 
    if (args.Severity == XmlSeverityType.Warning) { 
    // Do warning stuff... 
    } else if (args.Severity == XmlSeverityType.Error) { 
    // Do error stuff... 
    } 
} 
+0

你如何調用Validate方法?你是否處理ValidationEventHandler? – Jehof

+0

@Jehof我用示例代碼更新了我的問題。 –

+1

你如何處理'XmlReaderSettings'? – Jehof

回答

11

我不知道它是可以使用的驗證方法;如果使用驗證XmlReader在哪裏ValidationFlags被設置爲發出驗證警告的的XDocument,如

 XDocument doc = XDocument.Load("../../XMLFile1.xml"); 

     XmlSchemaSet schemaSet = new XmlSchemaSet(); 
     schemaSet.Add(null, "../../XMLSchema1.xsd"); 

     XmlReaderSettings xrs = new XmlReaderSettings(); 
     xrs.ValidationType = ValidationType.Schema; 
     xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
     xrs.Schemas = schemaSet; 
     xrs.ValidationEventHandler += (o, s) => { 
      Console.WriteLine("{0}: {1}", s.Severity, s.Message); 
     }; 

     using (XmlReader xr = XmlReader.Create(doc.CreateReader(), xrs)) 
     { 
      while (xr.Read()) { } 
     } 

那麼的ValidationEventHandler併發出對每個節點也沒有找到架構信息的警告。所以你的ValidationEventHandler可以檢查這樣的警告。但是您可以簡單地將doc.Root.Name.Namespace與調用Validate方法之前的模式的目標命名空間進行比較。