通过单一方法针对 XSD 验证 XML
Posted
技术标签:
【中文标题】通过单一方法针对 XSD 验证 XML【英文标题】:Validate XML against XSD in a single method 【发布时间】:2012-04-19 00:55:36 【问题描述】:我需要实现一个 C# 方法,该方法需要针对外部 XSD 验证 XML 并返回一个布尔结果,指示它是否格式正确。
public static bool IsValidXml(string xmlFilePath, string xsdFilePath);
我知道如何validate using a callback。我想知道它是否可以在一个方法中完成,而不使用回调。我需要这个纯粹是为了美观:我需要验证多达几十种类型的 XML 文档,所以我想做如下简单的事情。
if(!XmlManager.IsValidXml(
@"ProjectTypes\ProjectType17.xml",
@"Schemas\Project.xsd"))
throw new XmlFormatException(
string.Format(
"Xml '0' is invalid.",
xmlFilePath));
【问题讨论】:
【参考方案1】:根据您是否要对非异常事件使用异常,我可以想到几个选项。
如果您将 null 作为验证回调委托传递,如果 XML 格式错误,大多数内置验证方法都会抛出异常,因此您可以简单地捕获异常并返回 true
/false
,具体取决于情况。
public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName)
var xdoc = XDocument.Load(xmlFilePath);
var schemas = new XmlSchemaSet();
schemas.Add(namespaceName, xsdFilePath);
try
xdoc.Validate(schemas, null);
catch (XmlSchemaValidationException)
return false;
return true;
想到的另一个选项突破了without using a callback
标准的限制。除了传递预定义的回调方法,您还可以传递匿名方法并使用它来设置 true
/false
返回值。
public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName)
var xdoc = XDocument.Load(xmlFilePath);
var schemas = new XmlSchemaSet();
schemas.Add(namespaceName, xsdFilePath);
Boolean result = true;
xdoc.Validate(schemas, (sender, e) =>
result = false;
);
return result;
【讨论】:
这里的命名空间名称是什么? @hajirazin 你的意思是类型吗,它是XNamespace
。它没有在 sn-p 中定义,因为它与示例无关
即使我也有同样的要求。也为我工作。谢谢。
您是否介意提供一个命名空间的示例。目前还不清楚。
你可以为namespaceName添加null以上是关于通过单一方法针对 XSD 验证 XML的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 中的 Xerces 针对 XSD 1.1 进行 XML 验证