2016-12-23 41 views
2

當我通過加載下面的代碼的XMLSchema:的XmlSchemaSet負載模式,而不鍵約束

_XmlDocument = new XmlDocument(); 
XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.Schema; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 

XmlReader reader = XmlReader.Create(documentPath, settings); 

_XmlDocument.Load(reader); 
reader.Close(); 
XmlSchema schema = _XMLDocument.Schemas.Schemas().OfType<XmlSchema>().FirstOrDefault(); 

,並執行以下的單元測試代碼:

Assert.IsNotNull(schema); 
Assert.AreEqual(this.schemaSourceURI, schema.SourceUri); 

XmlSchemaElement queryElement = schema.Elements.Values.OfType<XmlSchemaElement>().Where(e => e.Name.Equals("QUERY")).FirstOrDefault(); 
Assert.IsNotNull(queryElement); 
Assert.IsTrue(queryElement.Constraints.OfType<XmlSchemaKey>().Count() > 0); 
Assert.IsTrue(queryElement.Constraints.OfType<XmlSchemaKeyref>().Count() > 0); 

一切工作正常。

當我通過

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); 
schemaSet.Add("http://www.w3.org/2001/XMLSchema", file); 
schemaSet.Compile(); 

return schemaSet.Schemas().OfType<XmlSchema>().FirstOrDefault(); 

XmlSchema schema = schemaSet.Schemas().OfType<XmlSchema>().FirstOrDefault(); 

然後從單元測試代碼既Assert.IsTrue加載XSD架構(上文)失敗。我兩次加載同一個文件。

如何獲取XmlSchemaSet以加載密鑰約束?兩個模式都來自同一個文件(.SourceUri都是this.schemaSourceURI)。

+0

確保在處理模式之前收到整個模式。你有一個異步事件,你必須阻止在處理之前等待整個文件。 – jdweng

+0

謝謝你的回答!哪種方法是異步的?文檔沒有關於它。也不是我能如何等待它。 – simsi

+0

我想你只需要扭轉第二和第三行,以便添加模式,添加事件處理程序,然後編譯。在讀取模式之前添加事件處理程序可能會導致驗證回調錯誤。 – jdweng

回答