我有一个模式文件,它没有定义任何目标命名空间,即它的定义如下所示:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<!--Elements, attributes, etc. -->
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
相应的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>
Run Code Online (Sandbox Code Playgroud)
使用例如Altova XMLSpy或Oxygen XML Editor对架构验证此XML失败.
但是,我在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...
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*nen 16
我不确定是否可以使用Validate方法; 如果您在XDocument上使用验证XmlReader,其中ValidationFlags设置为发出验证警告,如
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()) { }
}
Run Code Online (Sandbox Code Playgroud)
然后ValidationEventHandler会为每个找不到架构信息的节点发出警告.所以你的ValidationEventHandler可以检查这样的警告.但是,您可以简单地将doc.Root.Name.Namespace与调用Validate方法之前的模式的目标名称空间进行比较.