在不考虑xml namesapce的情况下,针对xsd验证xml

时间:2015-06-23 08:42:06

标签: c# xsd linq-to-xml

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

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中,targetnamespacetargetNamespace="urn:testnew/properties/v1.0",与xml不同。

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

1 个答案:

答案 0 :(得分:1)

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

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

XNamespace ns = "urn:testnew/properties/v1.0";

foreach (var element in xmlDocument.Descendants())
{
    element.Name = ns + element.Name.LocalName;
}

xmlDocument.Validate(...);

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

This question显示了使用XmlReaderXmlReaderSettings的备用验证方法,如果架构无法识别元素,则可以捕获警告。

相关问题