在不考虑xml namesapce的情况下,针对xsdvalidationxml

我正在使用以下代码来validation我的xml对xsd。

var isXmlValid = true; var vinListMessage = ""; var xsdFilePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "schema.xsd"); var schemas = new XmlSchemaSet(); schemas.Add(null, xsdFilePath); var xmlDocument = XDocument.Parse(vinListMessage); xmlDocument.Validate(schemas, (o, e) => { isXmlValid = false; }); Console.WriteLine(isXmlValid); 

请注意上面xml中的xmlns,其urn:test/properties/v1.0 。 现在在我的xsd中,我将targetnamespace作为targetNamespace="urn:testnew/properties/v1.0" ,这与xml中的不同。

现在无论我尝试针对xsdvalidationxml,它总是返回true。 但如果我匹配名称空间,那么它的工作正常。 我想避免依赖命名空间。 有什么建议?

命名空间是元素名称的一部分,因此除了确保它们是正确的之外,您可以做的事情并不多。

如果所有元素名称空间都应该相同,则可以在validation之前在所有元素上设置名称空间:

 XNamespace ns = "urn:testnew/properties/v1.0"; foreach (var element in xmlDocument.Descendants()) { element.Name = ns + element.Name.LocalName; } xmlDocument.Validate(...); 

遗憾的是,如果命名空间不匹配,则XML根据模式有效(前提是它格式正确),因为模式根本不适用于元素。 validation可以发出警告,说明元素无法识别,但是不可能通过XDocument.Validate扩展方法传递此标志(据我所知!)。

此问题显示了使用XmlReaderXmlReaderSettings的备用validation方法,如果架构无法识别元素,则允许您捕获警告。