在不考虑 xml 命名空间的情况下针对 xsd 验证 xml
Validate xml against xsd without considering xml namesapce
我正在使用以下代码来验证我的 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 中我有 targetnamespace
作为 targetNamespace="urn:testnew/properties/v1.0"
这与 xml.
中的不同
现在无论 xml 我尝试验证 xsd 它总是 return 正确。但如果我匹配名称空间,那么它工作正常。我想避免对命名空间的依赖。有什么建议吗?
命名空间是元素名称的一部分,因此除了确保它们正确之外,您无能为力。
如果所有元素命名空间都应该相同,您可以在验证之前在所有元素上设置命名空间:
XNamespace ns = "urn:testnew/properties/v1.0";
foreach (var element in xmlDocument.Descendants())
{
element.Name = ns + element.Name.LocalName;
}
xmlDocument.Validate(...);
不幸的是,如果命名空间不匹配,则 XML 根据架构有效(前提是格式正确),因为架构根本不适用于元素。验证 can 发出警告说元素未被识别,尽管不可能通过 XDocument.Validate
扩展方法传递此标志(据我所知! ).
This question 显示了使用 XmlReader
和 XmlReaderSettings
的替代验证方法,如果架构无法识别元素,您可以捕获警告。
我正在使用以下代码来验证我的 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 中我有 targetnamespace
作为 targetNamespace="urn:testnew/properties/v1.0"
这与 xml.
现在无论 xml 我尝试验证 xsd 它总是 return 正确。但如果我匹配名称空间,那么它工作正常。我想避免对命名空间的依赖。有什么建议吗?
命名空间是元素名称的一部分,因此除了确保它们正确之外,您无能为力。
如果所有元素命名空间都应该相同,您可以在验证之前在所有元素上设置命名空间:
XNamespace ns = "urn:testnew/properties/v1.0";
foreach (var element in xmlDocument.Descendants())
{
element.Name = ns + element.Name.LocalName;
}
xmlDocument.Validate(...);
不幸的是,如果命名空间不匹配,则 XML 根据架构有效(前提是格式正确),因为架构根本不适用于元素。验证 can 发出警告说元素未被识别,尽管不可能通过 XDocument.Validate
扩展方法传递此标志(据我所知! ).
This question 显示了使用 XmlReader
和 XmlReaderSettings
的替代验证方法,如果架构无法识别元素,您可以捕获警告。