2013-09-26 40 views
0

我正在使用基於dtd的Mismo 2.3.1架構。我將dtd轉換爲xsd,然後生成c#代碼以序列化/反序列化xml文檔的對象表示。如何使用c#XmlSerializer驗證xml,不包含xmlns = ...?

給定一個有效的mismo 2.3.1 xml文檔,我可以反序列化到我生成的C#類中。

我有代碼工作使用XmlSerializer與XmlReaderSettings和XmlSchmeas集合,閱讀我轉換後的xsd。

如果我在根元素中放入xmlns =「http:// mySchema ...」,並嘗試驗證故意無效的xml,按預期工作,我的驗證事件就會被精確描述。

如果我拿出xmlns屬性,然後我得到「無法找到元素架構信息[我的根元素]」

如何驗證XML的任何想法,進來沒有XMLNS規範呢?對序列化程序說的任何設置「在遇到此元素時使用此模式」?

在此先感謝!

回答

0
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); 
    } 
}