繁体   English   中英

在不考虑xml名称的情况下针对xsd验证xml

[英]Validate xml against xsd without considering xml namesapce

我正在使用以下代码针对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。 但是,如果我匹配名称空间,那么它就可以正常工作。 我想避免依赖命名空间。 有什么建议么?

名称空间是元素名称的一部分,因此除了确保它们正确之外,您无能为力。

如果假定所有元素名称空间都相同,则可以在验证之前在所有元素上设置名称空间:

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的替代验证方法,该验证方法将允许您在架构无法识别元素时捕获警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM