【发布时间】:2013-06-21 10:05:53
【问题描述】:
我有一个未定义任何目标命名空间的架构文件,即它的定义如下所示:
<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 编辑器失败。
但是我在 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 我已经用示例代码更新了我的问题。
-
你用
XmlReaderSettings做什么? -
好的,只是看到这行不通,对吧?
settings未使用。XDocument有可能吗?
标签: c# linq-to-xml