【问题标题】:xsd schema not valid?xsd 架构无效?
【发布时间】:2010-01-23 17:57:55
【问题描述】:

我已经从http://www.w3.org/2001/XMLSchema.xsd 下载了官方的“xsd 架构”。

我将其保存在本地并尝试使用此代码进行验证:

var sc = XmlSchema.Read(new FileStream(@"c:\temp\xsd.xsd", FileMode.Open), validate);
sc.Compile(validate);

它失败了,但它无法找到某些 DTD。

问题 1:为什么 xsd 的架构包含 xml 验证器无法处理的定义?

我从文件顶部删除了 DTD 定义,但出现了这个(以及更多)验证错误:

"Restriction of 'anySimpleType' is not allowed."

问题二:为什么编译xsd的schema会失败?

我已经使用 set.Add(...) 对 XmlSchemaSet 进行了同样的尝试,成功了

问题 3:验证 XmlSchema 和 XmlSchemaSet 有什么区别?

然后我创建一个从磁盘导入 xsd 模式的虚拟模式:

<s:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="c:\temp\xsd.xsd" />

当我将此架构添加到架构集中时,它再次失败并出现与上述相同的错误。

问题 4:为什么与直接添加 xsd 架构(有效)不同?

【问题讨论】:

    标签: c# .net xsd


    【解决方案1】:

    您将需要架构引用的其他几个文件:

    XmlSchema.dtddatatypes.dtd。下载它们后,您可以验证:

    class Program
    {
        static void Main()
        {
            var settings = new XmlReaderSettings();
            settings.ProhibitDtd = false;
            using (var reader = XmlReader.Create("XMLSchema.xsd", settings))
            {
                settings.Schemas.Add(XmlSchema.Read(reader, null));
            }
    
            using (var reader = XmlReader.Create("xsd.xsd", settings))
            {
                // This will throw if the XML file is not valid
                while (reader.Read()) ;
            }
        }
    }
    

    【讨论】:

    • 当我手动删除 DTD 声明时,它在我明确添加它时起作用(就像你一样)。但是,当我阅读另​​一个引用它的文档时,我仍然会在 schema-of-schema 本身上遇到这些验证错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2011-06-18
    • 2011-11-28
    • 2012-05-29
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多