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...
}
}
你如何調用Validate方法?你是否處理ValidationEventHandler? – Jehof
@Jehof我用示例代碼更新了我的問題。 –
你如何處理'XmlReaderSettings'? – Jehof