完整的XML Schema验证

5
我正在寻找一款工具,可以告诉我所有XML模式验证失败的信息。我看过的其他工具只会告诉我前几个错误,然后我必须先修复这些错误,才能继续查看下一个错误。我知道有些错误可能依赖于其他节点的不同顺序,但是如果数据类型格式不正确,即使节点顺序错误,也应该能够报告错误。
我已经查看了在其他问题中推荐的其他工具,它们都会在第一个错误后停止。因此,如果其中一个工具可以满足我的要求,请告诉我如何完成。
在.NET或Delphi中使用的编程库或技术也可以实现这一点。
5个回答

3

我经常使用XMLNotepad(不知道你是否尝试过)。它是免费的,并且可以同时报告很多错误,前提是这些错误是独立的而不是终端的!与Delphi编译器错误大致相同:一旦它开始走上错误的轨道,其后的一切通常都是无意义的。

总之,对于像TVB 3.2这样复杂的模式验证,它已经非常成功地为我工作了...


你需要安装XMLtools插件,但它似乎很好用,谢谢!http://sourceforge.net/projects/npp-plugins/ - Jim McKeeth
OxygenXML也可以做到这一点 - 可能甚至更好。我在另一个答案中对此进行了全面的撰写。 - Jim McKeeth

2

这段C#代码可以实现此功能 - 它将扫描整个XML文件,并根据提供的XSD文件对其进行验证,同时它会在发生任何验证错误(或模式中的错误)时输出所有错误。希望这有所帮助!

使用方法如下:

MyXmlValidator (name of XML file) (name of XSD file)

这就是全部内容!

Marc


    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);
    }

我几个月前尝试了一个非常类似于你的解决方案:即使这个方案比吉姆喜欢的要快得多。 - Jeroen Wiert Pluimers

2
问题在于XML Schema定义了您的XML文档的语言。验证器只是尝试使用该语言规范“编译”您的XML文档。
对于大多数具有固定语言(如Delphi或C#)的编译器来说,要变得足够宽松以报告多个错误需要相当长的时间。
XML Schema更像是一种动态语言,因此我估计验证工具的供应商甚至需要更长时间才能使它们变得足够宽松,以报告多个错误或在第一个错误之后继续执行。
我不确定是否有任何产品可以做到这一点,但已经有一些专利申请用于可能实现这一点的技术:http://www.faqs.org/patents/app/20080228810http://www.faqs.org/patents/app/20080229292 请注意,这些专利是在2008年申请的!
--jeroen

1

我认为问题在于,一旦模式由于任何原因无效,其后的任何内容都是不可靠的,因此进一步的验证失败可能会误导。超出“此文档是否有效”的验证需求可能太过专业化,未能引起工具公司的兴趣。

从验证器的角度来看,在它将被用于的绝大多数情况下,遇到故障后继续验证是没有意义的。文档不能变得比它已经无效更加无效,一旦确定为无效,就不能发现它是有效的。

也许了解您为什么希望这样做会很有用?

例如,如果您正在尝试格式化符合模式的文档,则应该有工具可以为您从给定模式生成示例文档实例,以充当参考或示例/模板。


0

我发现OxygenXML编辑器也做得很好。它是一款商业编辑器,但验证是使用Xerces引擎进行的(还有其他选项可供选择)。我以前尝试过Xerces,但无法报告第一个错误之后的内容,但他们说他们强制保持报告。它做得非常好。

XMLSpy正式地不支持此功能。基于我对这两个编辑器的了解,我更喜欢OxygenXML而不是XMLSpy,不仅因为它的这个功能(它的实现方式真的很好)。


oXygen是一个很棒的工具。不知道我们在没有它的情况下如何处理XSD。此外,它还能生成高质量的模式文档。 - user34411

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接