根据xsd验证xml,而不考虑xml名称

本文关键字:xml 不考虑 名称 验证 根据 xsd | 更新日期: 2023-09-27 17:59:01

我正在使用以下代码根据xsd验证我的xml。

var isXmlValid = true;
var vinListMessage = "<root xmlns:xsd='"http://www.w3.org/2001/XMLSchema'" xmlns:xsi='"http://www.w3.org/2001/XMLSchema-instance'" xmlns='"urn:test/properties/v1.0'"><test12121 id='"3'"></test></root>";
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中的不同。

现在,无论我试图根据xsd验证什么xml,它总是返回true。但是,如果我匹配名称空间,那么它就可以正常工作。我想避免对命名空间的依赖。有什么建议吗?

根据xsd验证xml,而不考虑xml名称

名称空间是元素名称的一部分,因此除了确保它们是正确的之外,您没有什么可做的。

如果所有元素的名称空间都应该相同,那么在验证之前可以在所有元素上设置名称空间:

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

不幸的是,如果名称空间不匹配,那么XML根据模式是有效的(前提是它的格式正确),因为模式根本不适用于元素。验证可以发出警告,表示元素未被识别,尽管不可能通过XDocument.Validate扩展方法传递此标志(据我所知!)。

此问题显示了使用XmlReaderXmlReaderSettings的另一种验证方法,如果架构无法识别元素,该方法将允许您捕获警告。