【问题标题】:How to validate xml, not containing xmlns=..., with c# XmlSerializer?如何使用 c# XmlSerializer 验证不包含 xmlns=... 的 xml?
【发布时间】:2013-09-26 16:04:10
【问题描述】:

我正在使用基于 dtd 的架构的 Mismo 2.3.1。我将 dtd 转换为 xsd,然后生成 c# 代码来序列化/反序列化 xml 文档的对象表示。

给定一个有效的 mismo 2.3.1 xml 文档,我可以反序列化到我生成的 C# 类中。

我有代码可以使用 XmlSerializer 以及 XmlReaderSettings 和 XmlSchmeas 集合,读取转换后的 xsd。

如果我将 xmlns="http://mySchema..." 放在根元素中,并尝试验证故意无效的 xml,按预期工作,我的验证事件会得到准确的描述。

如果我取出 xmlns 属性,那么我会得到“找不到元素 [我的根元素] 的架构信息”

关于如何验证没有 xmlns 规范的 xml 的任何想法?对序列化程序说“遇到此元素时使用此架构”的任何设置?

提前致谢!

【问题讨论】:

    标签: c# xml validation xsd dtd


    【解决方案1】:
    static void Main() {
        var settings = new XmlReaderSettings();
        settings.NameTable = new NameTable();
    
        var nsMgr = new XmlNamespaceManager(settings.NameTable);
        nsMgr.AddNamespace("", "http://example.com/2013/ns"); // <-- set default namespace
    
        settings.ValidationType = ValidationType.Schema;
        settings.Schemas.Add(null, @"C:\XSDSchema.xsd"); // <-- set schema location for the default namespace
    
        var parserCtx = new XmlParserContext(settings.NameTable, nsMgr, XmlSpace.Default);
    
        using (var reader = XmlReader.Create(@"C:\file.xml", settings, parserCtx)) {
            var serializer = new XmlSerializer(typeof(Foo));
            Foo f = (Foo)serializer.Deserialize(reader);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多