【问题标题】:C# validating a XML with a XSDC# 使用 XSD 验证 XML
【发布时间】:2020-08-06 14:05:00
【问题描述】:

我是 C# 新手,我正在尝试使用 C# 和 Visual Studio Code (VSC) 创建一个 .exe。 .exe 应接收两个参数,它们是 xsd 和 xml 文件的完整路径。

例子:

  • xpto.exe "C:\Users\dpaiva\Desktop\catalog.xml" "D:\catalog.xsd"

我正在修改我发现的代码,因为这不是 IT 或 C# 中的新“问题”。

static void Main(string[] args) {
    if (args == null)
    {
        throw new ArgumentNullException ("source");
    } else {
    var xsdfile = "";
    var xmlfile = "";
    for (int i = 0; i < args.Length; i++){
        if (i==0){
            xsdfile = args[i];
        } else if (i==1){
            xmlfile = args[i];
        }
    }
    XmlSchemaSet schema = new XmlSchemaSet();
    if (xsdfile != null){
        schema.Add("", xsdfile);
    } 
    XmlReader rd = XmlReader.Create(xmlfile);  
    XDocument doc = XDocument.Load(rd);  
    doc.Validate(schema, ValidationEventHandler);  
    }  
    static void ValidationEventHandler(object sender, ValidationEventArgs e) {  
    XmlSeverityType type = XmlSeverityType.Warning;  
        if (Enum.TryParse < XmlSeverityType > ("Error", out type)) {  
        if (type == XmlSeverityType.Error) throw new Exception(e.Message);  
        }  
    }
}

当我在 VSC 中调试代码并显示以下错误时: 第 37 行:schema.Add("", xsdfile);

System.Private.Xml.dll 中的 System.ArgumentNullException:“值不能为空”。

由于我对 C# 的经验不足,我不知道如何解决这个问题,以及我的代码是否可以正确处理 url。

谁能帮我解决这个问题?

【问题讨论】:

    标签: c# xml visual-studio-code xsd xsd-validation


    【解决方案1】:

    这可以满足您的需求,祝您好运。

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    using System.Xml.Schema;
    using System.Xml.XPath;
    
    namespace xmlutil {
        class Program {
            static void Main(string[] args) {
    
                string strFileName = String.Empty;
    
                try {
    
                    if (args.Length < 2) {
                        throw new Exception("Usage: xmlutil.exe [file.xml|folder\\*.xml] file.xsd");
                    }
    
                    System.IO.FileAttributes attr = System.IO.File.GetAttributes( args[0] );
    
                    XmlReaderSettings settings = new XmlReaderSettings();
    
                    strFileName = args[1]; // to detect errors in the schema
    
                    settings.Schemas.Add(null, args[1]);
                    settings.ValidationType = ValidationType.Schema;
                    settings.ValidationFlags =
                                    XmlSchemaValidationFlags.ReportValidationWarnings |
                                    XmlSchemaValidationFlags.ProcessIdentityConstraints |
                                    XmlSchemaValidationFlags.ProcessInlineSchema |
                                    XmlSchemaValidationFlags.ProcessSchemaLocation;
    
    
                    if (attr.HasFlag(System.IO.FileAttributes.Directory)) {
    
                        string[] directories = Directory.GetDirectories(args[0]);
    
    
    
    
                        string[] files = Directory.GetFiles(args[0], "*.xml", SearchOption.AllDirectories);
                        int i = files.Length;
                        Console.WriteLine("Processing folder " + args[0] + " - " + i + " files.");
    
                        int nTen = Convert.ToInt32(files.Length / 10);
                        int nCount = 0;
    
                        for (i = 0; i < files.Length; i++) {
                            strFileName = files[i];
                            try {
                                ValidateFile(files[i], settings);
    
                                if ((i % nTen) == 0) {
                                    if (nCount > 0) {
                                        Console.WriteLine(nCount * 10 + "% complete.");
                                    }
                                    nCount++;
                                }
                            } catch (Exception ex2) {
                                Console.Error.WriteLine(strFileName);
                                Console.Error.WriteLine(ex2.Message);
                            }
                        }
                    } else {
                        strFileName = args[0];
                        ValidateFile(args[0], settings);
                    }
                } catch (XmlSchemaException exs) {
                    Console.Error.WriteLine(strFileName + " schema validation exeption" );
                    Console.Error.WriteLine(exs.Message + " Line: " + exs.LineNumber + " Column: " + exs.LinePosition );
                } catch (Exception ex) {
                    Console.Error.WriteLine(strFileName);
                    Console.Error.WriteLine(ex.Message);
                }
                
            }
    
            static void ValidateFile(string strXMLFile, XmlReaderSettings settings) {
    
                XmlDocument document = new XmlDocument();
                ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
    
                XmlReader reader = XmlReader.Create(strXMLFile, settings);
                document.Load(reader);
                // the following call to Validate succeeds.
                document.Validate(eventHandler);
            }
    
            static void ValidationEventHandler(object sender, ValidationEventArgs e) {
                switch (e.Severity) {
                    case XmlSeverityType.Error:
                        Console.WriteLine("Error: {0}", e.Message);
                        break;
                    case XmlSeverityType.Warning:
                        Console.WriteLine("Warning {0}", e.Message);
                        break;
                }
    
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。但是,这具有我需要的更多功能。我不需要获取目录中的所有 xml 文件,参数将是要验证的 xml 的路径,另一个是要进行匹配的 xsd 的路径。我也不需要计数器,因为它只是针对一个 xsd 文件验证一个 xml 文件。我正在尝试调整您发送的代码,但是在不破坏它的情况下我遇到了一些问题
    • 顺便说一句,该程序可以使用 XML 文件的文件夹或单个 XML 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多