我正在寻找能够告诉我所有 XML Schema验证失败的工具。我看过的所有其他工具只是告诉我第一对,然后我必须先解决这些问题,然后再告诉我下一个错误。我意识到某些错误可能依赖于处于不同顺序的其他节点,但是即使节点的顺序错误,也应该能够报告格式错误的数据类型之类的内容。
我已经查看了其他问题的其他工具建议,并且在第一次失败后它们都停止了。因此,如果其中一个工具能够满足我的需求,那么请让我知道实现这一目标的步骤。
允许我在.NET或Delphi中执行此操作的编程库或技术将起作用。
答案 0 :(得分:3)
我经常使用 XMLNotepad 。 (我不知道你是否已经尝试过了。)
它是'自由的,并且很好地同时报告了很多错误,只要它们是独立的而不是终端的!与Delphi中的编译器错误大致相同:一旦它开始在错误的轨道上,所有后续操作通常都是无稽之谈。
无论如何,它对我来说非常有效,可以对TVB 3.2等非常复杂的模式进行验证......
答案 1 :(得分:2)
现有的问题是XML Schema定义了XML文档的语言。验证器然后只是尝试使用该语言规范“编译”您的XML文档。
对于大多数具有固定语言的编译器(如Delphi或C#),为了报告多个错误,需要花费很长时间才能变得足够轻松。
XML Schema更像是一种动态语言,因此我估计,验证工具的供应商会更长时间使其足够轻松以报告多个错误,或者在第一次错误后继续。
我不确定是否有任何产品可以执行此操作,但是有一些专利可以用于执行此操作的内容:http://www.faqs.org/patents/app/20080228810和http://www.faqs.org/patents/app/20080229292
请注意,这些已于2008年提交!
- 的Jeroen
答案 2 :(得分:2)
C#中的代码应该只是这样 - 它将扫描整个XML并根据提供的XSD对其进行验证,并且它会在发生时吐出所有验证错误(或模式中的错误!)。希望这有帮助!
你使用它的方式是:
MyXmlValidator (name of XML file) (name of XSD file)
这就是全部!
马克
static void Main(string[] args)
{
ShowTitle();
if(args.Length < 2)
{
ShowUsage();
return;
}
string xmlFileName = args[0];
string xsdFileName = args[1];
if(!File.Exists(xmlFileName))
{
ShowError(string.Format("XML File '{0}' does not exist)", xmlFileName));
return;
}
if (!File.Exists(xsdFileName))
{
ShowError(string.Format("XSD schema '{0}' does not exist)", xsdFileName));
return;
}
StreamReader xsdReader = new StreamReader(xsdFileName);
XmlSchema Schema = new XmlSchema();
Schema = XmlSchema.Read(xsdReader, new ValidationEventHandler(XSDValidationEventHandler));
XmlReaderSettings ReaderSettings = new XmlReaderSettings();
ReaderSettings.ValidationType = ValidationType.Schema;
ReaderSettings.Schemas.Add(Schema);
ReaderSettings.ValidationEventHandler += new ValidationEventHandler(XMLValidationEventHandler);
XmlTextReader xmlReader = new XmlTextReader(xmlFileName);
XmlReader objXmlReader = XmlReader.Create(xmlReader, ReaderSettings);
while (objXmlReader.Read())
{ }
Console.WriteLine("Successful validation completed!");
}
private static void XSDValidationEventHandler(object sender, ValidationEventArgs e)
{
Console.WriteLine("Error reading XSD: " + e.Message);
}
private static void XMLValidationEventHandler(object sender, ValidationEventArgs e)
{
Console.WriteLine("Validation error: " + e.Message);
}
private static void ShowError(string message)
{
Console.WriteLine("ERROR: " + message);
}
private static void ShowUsage()
{
Console.WriteLine("USAGE: GaraioXmlValidator (name of XML file) (name of XSD file)" + Environment.NewLine);
}
private static void ShowTitle()
{
Console.WriteLine("GaraioXmlValidator v1.0 (c) 2008 by Garaio Technology Lab" + Environment.NewLine);
}
答案 3 :(得分:1)
我认为问题在于,一旦架构因任何原因无效,其后的任何其他内容都是不可靠的,因此任何进一步的验证失败都可能会产生误导。除了“这个文件有效”之外进行验证的需要可能过于专业化,需要吸引工具公司的兴趣。
从绝大多数用途的验证器的角度来看,一旦遇到故障就继续验证是没有意义的。该文件不会变得比现有文件更无效,并且一旦被确定为无效,就无法被发现有效。
也许了解你为什么要这样做会很有用?
e.g。如果您尝试格式化文档以符合模式,那么有些工具可以为您生成给定模式的示例文档实例,以充当参考或示例/模板。
答案 4 :(得分:0)
我发现OxygenXML editor也做得很好。它是一个商业编辑器,但是使用Xerces engine进行验证以进行验证(使用其他选项。)我之前尝试过Xerces,并且无法报告第一个错误,但是他们说他们强迫它继续报道。它做得非常好。
XMLSpy正式不支持此功能。根据我对两位编辑的看法,我更喜欢OxygenXML,而不是XMLSpy,不仅仅是为了这个功能(这样做非常好)。