首页 > 解决方案 > 针对 XSD 的 C# XML 验证如何工作?

问题描述

我创建了一个库来使用XmlReaderSettings验证 XML 文件和 XSD 文件。它工作正常,直到用户在 XSD 文件中填充数据,然后将 XSD 扩展名更改为 XML并使用库来验证它们,并且该文件通过了验证。(虽然这不是创建 XML 文件的正确方法,但他们已经这样做了!)

所以我想知道 XmlReaderSettings 是如何工作的?以及如何检查 XML 文件不是 XSD 文件?

这是我的代码:

public static class XmlValidator
    {

        /// <summary>
        /// Basic Validation of DA application.
        /// Validate xml file with xsd file.
        /// : return list of errors from validation, return empty list if no error occur.
        /// </summary>
        /// <param name="pathXml">Xml file path.</param>
        /// <param name="pathXsd">Xsd file path.</param>
        /// <returns>Return list of errors from validation, return empty list if no error occur.</returns>
        public static List<string> Validate(string pathXml, string pathXsd, Action<DAStatus> callBack = null)
        {
            if (string.IsNullOrWhiteSpace(pathXml) || string.IsNullOrWhiteSpace(pathXsd))
            {
                throw new ArgumentException("Null or Empty are detected.");
            }
            else if (Path.GetExtension(pathXml).ToLower() != ".xml")
            {
                throw new InvalidFileTypeException(pathXml, ".xml");
            }
            else if (Path.GetExtension(pathXsd).ToLower() != ".xsd")
            {
                throw new InvalidFileTypeException(pathXsd, ".xsd");
            }

            List<string> errorList = new List<string>();
            using (var fileStream = File.OpenRead(pathXml))
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.Schemas.Add(null, pathXsd);
                settings.ValidationType = ValidationType.Schema;
                settings.ValidationEventHandler += (sender, e) => XMLReaderValidateHandler(e, errorList);
                XmlReader xml = XmlReader.Create(fileStream, settings);

                long lastPosition = 0;
                long[] percent = { 0, 0 };
                DAStatus progress = new DAStatus();

                while (xml.Read())
                {
                    // read and validate xml by xsd.
                    // Add callBack
                    if (callBack != null)
                    {
                        lastPosition = fileStream.Position;
                        percent[1] = Math.Min(100, (100 * lastPosition / fileStream.Length));
                        if (percent[0] < percent[1])
                        {
                            percent[0] = percent[1];
                            progress.ProgressPercent = percent[0];
                            callBack(progress);
                        }
                    }
                }
            }

            return errorList;
        }

        private static void XMLReaderValidateHandler(ValidationEventArgs e, List<string> errorList)
        {
            errorList.Add(e.Message);
        }
    }

更新:我不认为我的问题与你们提到的问题重复,因为据我了解,该问题是关于自动使用特定位置的 XSD 文件来验证 XML,但我的问题更像是用户错误从以错误的方式创建 XML 文件。(通常他们应该以正确的方式创建 XML 文件,但他们希望我验证 XSD-XML 文件。)

用户已经向我发送了通过更改 XSD 文件创建的 XML 文件示例,因此我可以提供示例。

通常 XSD 元素如下所示:

<xs:element name="address" type="M_Address" />

他们像这样更改元素(还将文件扩展名更改为 .xml):

<xs:element name="test district" type="M_Address" />

标签: c#.netxmlxsdxsd-validation

解决方案


推荐阅读