代码之家  ›  专栏  ›  技术社区  ›  Jim McKeeth

完成XML架构验证

  •  5
  • Jim McKeeth  · 技术社区  · 15 年前

    我在找一个能告诉我 全部的 XML架构验证失败。我看过的所有其他工具,所以只需告诉我第一对,然后我必须修复它们,然后它才会告诉我下一个错误。我认识到有些错误可能依赖于处于不同顺序的其他节点,但是像数据类型格式错误这样的事情应该能够被报告,即使节点的顺序是错误的。

    我已经查看了其他工具建议的其他问题,它们在第一次失败后都会停止。因此,如果这些工具中的一个可以满足我的需要,那么请告诉我实现这一点的步骤。

    我可以在.NET或Delphi中使用的编程库或技术。

    5 回复  |  直到 15 年前
        1
  •  3
  •   Jim McKeeth    15 年前

    我用 XML记事本 很多。(我不知道你是否已经试过了。)

    它是免费的,如果它们是独立的,而不是终端的,那么它在同时报告大量错误方面做得很好!与Delphi中的编译器错误大致相同:一旦它在错误的轨道上开始,后面的所有内容通常都是无意义的。

    不管怎样,它对我来说非常有效,可以针对非常复杂的模式进行验证,比如TVB 3.2…

        2
  •  2
  •   Jeroen Wiert Pluimers    15 年前

    目前的问题是XML模式定义了XML文档的语言。然后,验证器只尝试使用该语言规范“编译”XML文档。

    对于大多数使用固定语言的编译器(如Delphi或C),要报告多个错误,需要相当长的时间才能足够轻松。

    XML模式更像是一种动态语言,因此我估计验证工具的供应商需要更长的时间才能轻松地报告多个错误,或者在第一个错误之后继续。

    我不确定是否有任何产品会这样做,但有一些专利可能会这样做: http://www.faqs.org/patents/app/20080228810 http://www.faqs.org/patents/app/20080229292

    注意,这些文件已于2008年提交!

    ——杰罗恩

        3
  •  2
  •   marc_s    15 年前

    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);
        }
    
        4
  •  1
  •   Deltics    15 年前

    我认为问题在于,一旦一个模式由于某种原因无效,那么后面的任何其他内容都是不可靠的,因此任何进一步的验证失败都可能产生误导。除了“本文档是否有效”之外,执行验证的需要可能过于专业化,因此需要吸引工具公司的兴趣。

    从验证器的角度来看,对于它将被投入的绝大多数用途来说,一旦遇到故障就继续进行验证是没有意义的。该文档不能变得比现有文档更无效,并且一旦确定其无效,就无法发现它是有效的。

    也许理解你为什么要这样做会很有用?

    例如,如果您试图将文档格式化为符合模式,那么有一些工具可以从给定的模式生成示例文档实例,作为引用或示例/模板。

        5
  •  1
  •   Jim McKeeth    15 年前

    我发现了 OxygenXML editor 也做得很好。它是一个商业编辑器,但验证是用 Xerces engine 为了进行验证(可以选择使用其他方法),我以前尝试过Xerces,但无法让它报告第一个错误,但他们说他们强制它继续报告。做得真不错。

    XMLSpy 正式 支持这一点。根据我对这两个编辑器的了解,我更喜欢oxygenxml,而不是xmlspy,这也不仅仅是因为它的特性(它做起来真的很好)。