完整的XML模式验证

时间:2009-10-18 04:12:53

标签: .net xml delphi xsd schema

我正在寻找能够告诉我所有 XML Schema验证失败的工具。我看过的所有其他工具只是告诉我第一对,然后我必须先解决这些问题,然后再告诉我下一个错误。我意识到某些错误可能依赖于处于不同顺序的其他节点,但是即使节点的顺序错误,也应该能够报告格式错误的数据类型之类的内容。

我已经查看了其他问题的其他工具建议,并且在第一次失败后它们都停止了。因此,如果其中一个工具能够满足我的需求,那么请让我知道实现这一目标的步骤。

允许我在.NET或Delphi中执行此操作的编程库或技术将起作用。

5 个答案:

答案 0 :(得分:3)

我经常使用 XMLNotepad 。 (我不知道你是否已经尝试过了。)

它是'自由的,并且很好地同时报告了很多错误,只要它们是独立的而不是终端的!与Delphi中的编译器错误大致相同:一旦它开始在错误的轨道上,所有后续操作通常都是无稽之谈。

无论如何,它对我来说非常有效,可以对TVB 3.2等非常复杂的模式进行验证......

答案 1 :(得分:2)

现有的问题是XML Schema定义了XML文档的语言。验证器然后只是尝试使用该语言规范“编译”您的XML文档。

对于大多数具有固定语言的编译器(如Delphi或C#),为了报告多个错误,需要花费很长时间才能变得足够轻松。

XML Schema更像是一种动态语言,因此我估计,验证工具的供应商会更长时间使其足够轻松以报告多个错误,或者在第一次错误后继续。

我不确定是否有任何产品可以执行此操作,但是有一些专利可以用于执行此操作的内容:http://www.faqs.org/patents/app/20080228810http://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,不仅仅是为了这个功能(这样做非常好)。