0

关于如何验证我的 XSD 的任何建议?

我想要一个单元测试来检查我的 XSD 的有效性,但我无法克服以下错误:

“出于安全原因,此 XML 文档中禁止 DTD。要启用 DTD 处理,请将 XmlReaderSettings 上的 DtdProcessing 属性设置为 Parse 并将设置传递给 XmlReader.Create 方法。”

这似乎是因为 W3 模式定义引用了 DTD。

这是单元测试(xUnit):

namespace MyNamespace.Profile.Test
{
    using System;
    using System.IO;
    using System.Xml;
    using System.Xml.Schema;

    using Xunit;

    public class ProfilesSchemaTests
    {
        [Fact]
        public void ShouldValidateProfilesXsd()
        {
            string profilesXsd = "Profiles.xsd";
            Assert.DoesNotThrow(() => ValidateXsd(profilesXsd));
        }

        private static void ValidateXsd(string path)
        {
            const string W3Schema = "http://www.w3.org/2001/XMLSchema.xsd";

            var config = new XmlReaderSettings { ValidationType = ValidationType.Schema };
            config.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
            config.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
            config.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
            config.DtdProcessing = DtdProcessing.Parse;
            config.XmlResolver = null;
            config.ValidationEventHandler += ValidationCallBack;
            config.Schemas.Add(null, W3Schema);

            using (var reader = XmlReader.Create(path, config))
            {
                while (reader.Read())
                {
                }
            }
        }

        private static void ValidationCallBack(object sender, ValidationEventArgs validationEventArgs)
        {
            Console.WriteLine(
                validationEventArgs.Severity == XmlSeverityType.Warning
                    ? "\tWarning: Matching schema not found.  No validation occurred. {0}"
                    : "\tValidation error: {0}",
                validationEventArgs.Message);
        }
    }
}
4

1 回答 1

0

MSDN 论坛上,我有一个非常好的建议 - 使用 XmlSchemaSet.Compile 作为验证。

于 2012-07-06T08:45:33.803 回答