0

我正在使用基于 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 的任何想法?对序列化程序说“遇到此元素时使用此模式”的任何设置?

提前致谢!

4

1 回答 1

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);
    }
}
于 2013-09-26T17:25:24.133 回答