C# 反序列化XML时为空值

C# 反序列化XML时为空值,c#,xml,null,deserialization,C#,Xml,Null,Deserialization,我尝试反序列化根据同一模式构建的不同XML文档,是的,我是这个主题的新手。我设法从使用xsd文件作为“类型定义语言”(VS2013)的过程中检索到一些自动生成的代码,对我来说,它看起来不错,基本上可以运行,这意味着我可以启动程序。但是,我的程序没有输出,通过调试,我可以看到最重要的字段没有填充。情况是这样的(最初生成的代码和XML当然要长得多,但我把话题转到产生问题的类): XML: 调试时,它向我显示AllObject包含3个FeaturePropertyType类型的项(即可疑的xml工作表

我尝试反序列化根据同一模式构建的不同XML文档,是的,我是这个主题的新手。我设法从使用xsd文件作为“类型定义语言”(VS2013)的过程中检索到一些自动生成的代码,对我来说,它看起来不错,基本上可以运行,这意味着我可以启动程序。但是,我的程序没有输出,通过调试,我可以看到最重要的字段没有填充。情况是这样的(最初生成的代码和XML当然要长得多,但我把话题转到产生问题的类):

XML:

调试时,它向我显示AllObject包含3个FeaturePropertyType类型的项(即可疑的xml工作表中myClass1和myClass2的数量),但这些项的属性项为null

当我在互联网上搜索时,许多人认为这可能是名称空间的问题。所以我尝试了一点,前后改变,但没有成功。无论如何,我不认为在自动生成的代码中改变太多是个好主意

如果有人能就这个问题给我一些建议,我会很高兴

问候 商标

编辑: 我不得不编辑代码,因为我忘了编写myClass1和myClass2对AbstractFeatureType的继承

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            MainDatas mainDatas = new MainDatas() {
                contains = new MainDatasContains() {
                    featureCollection = new FeatureCollection(){
                        id = "UHL",
                        boundedBy = 999.9,
                        featureMembers = new List<FeatureMember>() {
                            new FeatureMember() {
                                myClass1 = new MyClass1() {
                                    id = "XXX0001"
                                }
                            },
                            new FeatureMember() {
                                myClass2 = new MyClass2() {
                                    id = "XXX0001"
                                }
                            },
                            new FeatureMember() {
                                myClass1 = new MyClass1() {
                                    id = "XXX0003"
                                }
                            }

                        }
                    }
                }
            };


            XmlSerializer serializer = new XmlSerializer(typeof(MainDatas));

            StreamWriter writer = new StreamWriter(FILENAME);
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("aan", "http://www.andAnotherNamespace.com/");
            ns.Add("ons", "http://www.myOtherNamespace.com/");
            ns.Add("", "http://www.myNamespace.com/");

            serializer.Serialize(writer, mainDatas, ns);
            writer.Flush();
            writer.Close();
            writer.Dispose();

            XmlSerializer xs = new XmlSerializer(typeof(MainDatas));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            MainDatas newMainDatas = (MainDatas)xs.Deserialize(reader);
        }
    }
    [XmlRoot("mainDatas", Namespace = "http://www.myNamespace.com/")]   
    public class MainDatas
    {

        [XmlElement("contains")]
        public MainDatasContains contains { get; set; }
    }

    [XmlRoot("contains")]
    public class MainDatasContains
    {

        [XmlElement("FeatureCollection", Namespace = "http://www.myOtherNamespace.com/")]
        public FeatureCollection featureCollection { get; set; }
    }

    [XmlRoot(ElementName = "FeatureCollection")]
    public class FeatureCollection
    {
        [XmlAttribute("id", Namespace = "http://www.andAnotherNamespace.com/")]
        public string id { get; set; }

        [XmlElement("boundedBy", Namespace = "http://www.andAnotherNamespace.com/")]
        public double boundedBy { get; set; }

        [XmlElement("featureMember", Namespace = "http://www.andAnotherNamespace.com/")]
        public List<FeatureMember> featureMembers { get; set; }
    }

    [XmlRoot("featureMember")]
    public class FeatureMember
    {
        [XmlElement("myClass1")]
        public MyClass1 myClass1 { get; set; }

        [XmlElement("myClass2")]
        public MyClass2 myClass2 { get; set; }
    }

    [XmlRoot("myClass1")]
    public class MyClass1
    {
        [XmlAttribute("id", Namespace = "http://www.andAnotherNamespace.com/")]
        public string id { get; set; }

    }

    [XmlRoot("myClass2")]
    public class MyClass2
    {
        [XmlAttribute("id")]
        public string id { get; set; }

    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
maindass maindass=新的maindass(){
contains=新的MainDatasContains(){
featureCollection=新featureCollection(){
id=“UHL”,
边界比=999.9,
featureMembers=新列表(){
新功能成员(){
myClass1=新的myClass1(){
id=“XXX0001”
}
},
新功能成员(){
myClass2=新的myClass2(){
id=“XXX0001”
}
},
新功能成员(){
myClass1=新的myClass1(){
id=“XXX0003”
}
}
}
}
}
};
XmlSerializer serializer=新的XmlSerializer(typeof(maindas));
StreamWriter writer=新的StreamWriter(文件名);
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
ns.添加(“aan”http://www.andAnotherNamespace.com/");
附加条款http://www.myOtherNamespace.com/");
添加(“,”http://www.myNamespace.com/");
serializer.Serialize(writer、maindas、ns);
writer.Flush();
writer.Close();
writer.Dispose();
XmlSerializer xs=新的XmlSerializer(typeof(maindas));
XmlTextReader=新的XmlTextReader(文件名);
maindass newmaindass=(maindass)xs.Deserialize(reader);
}
}
[XmlRoot(“mainDatas”,名称空间=”http://www.myNamespace.com/")]   
公共类主数据
{
[XmlElement(“包含”)]
公共MainDatasContains包含{get;set;}
}
[XmlRoot(“包含”)]
公共类main包含
{
[XmlElement(“FeatureCollection”,命名空间=”http://www.myOtherNamespace.com/")]
公共功能集合功能集合{get;set;}
}
[XmlRoot(ElementName=“FeatureCollection”)]
公共类功能集合
{
[XmlAttribute(“id”,命名空间=”http://www.andAnotherNamespace.com/")]
公共字符串id{get;set;}
[XmlElement(“boundedBy”,命名空间=”http://www.andAnotherNamespace.com/")]
公共双边界由{get;set;}
[XmlElement(“featureMember”,命名空间=”http://www.andAnotherNamespace.com/")]
公共列表功能成员{get;set;}
}
[XmlRoot(“功能成员”)]
公共类功能成员
{
[XmlElement(“myClass1”)]
公共MyClass1 MyClass1{get;set;}
[XmlElement(“myClass2”)]
公共MyClass2 MyClass2{get;set;}
}
[XmlRoot(“myClass1”)]
公共课MyClass1
{
[XmlAttribute(“id”,命名空间=”http://www.andAnotherNamespace.com/")]
公共字符串id{get;set;}
}
[XmlRoot(“myClass2”)]
公共类MyClass2
{
[XmlAttribute(“id”)]
公共字符串id{get;set;}
}
}
​
试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            MainDatas mainDatas = new MainDatas() {
                contains = new MainDatasContains() {
                    featureCollection = new FeatureCollection(){
                        id = "UHL",
                        boundedBy = 999.9,
                        featureMembers = new List<FeatureMember>() {
                            new FeatureMember() {
                                myClass1 = new MyClass1() {
                                    id = "XXX0001"
                                }
                            },
                            new FeatureMember() {
                                myClass2 = new MyClass2() {
                                    id = "XXX0001"
                                }
                            },
                            new FeatureMember() {
                                myClass1 = new MyClass1() {
                                    id = "XXX0003"
                                }
                            }

                        }
                    }
                }
            };


            XmlSerializer serializer = new XmlSerializer(typeof(MainDatas));

            StreamWriter writer = new StreamWriter(FILENAME);
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("aan", "http://www.andAnotherNamespace.com/");
            ns.Add("ons", "http://www.myOtherNamespace.com/");
            ns.Add("", "http://www.myNamespace.com/");

            serializer.Serialize(writer, mainDatas, ns);
            writer.Flush();
            writer.Close();
            writer.Dispose();

            XmlSerializer xs = new XmlSerializer(typeof(MainDatas));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            MainDatas newMainDatas = (MainDatas)xs.Deserialize(reader);
        }
    }
    [XmlRoot("mainDatas", Namespace = "http://www.myNamespace.com/")]   
    public class MainDatas
    {

        [XmlElement("contains")]
        public MainDatasContains contains { get; set; }
    }

    [XmlRoot("contains")]
    public class MainDatasContains
    {

        [XmlElement("FeatureCollection", Namespace = "http://www.myOtherNamespace.com/")]
        public FeatureCollection featureCollection { get; set; }
    }

    [XmlRoot(ElementName = "FeatureCollection")]
    public class FeatureCollection
    {
        [XmlAttribute("id", Namespace = "http://www.andAnotherNamespace.com/")]
        public string id { get; set; }

        [XmlElement("boundedBy", Namespace = "http://www.andAnotherNamespace.com/")]
        public double boundedBy { get; set; }

        [XmlElement("featureMember", Namespace = "http://www.andAnotherNamespace.com/")]
        public List<FeatureMember> featureMembers { get; set; }
    }

    [XmlRoot("featureMember")]
    public class FeatureMember
    {
        [XmlElement("myClass1")]
        public MyClass1 myClass1 { get; set; }

        [XmlElement("myClass2")]
        public MyClass2 myClass2 { get; set; }
    }

    [XmlRoot("myClass1")]
    public class MyClass1
    {
        [XmlAttribute("id", Namespace = "http://www.andAnotherNamespace.com/")]
        public string id { get; set; }

    }

    [XmlRoot("myClass2")]
    public class MyClass2
    {
        [XmlAttribute("id")]
        public string id { get; set; }

    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
maindass maindass=新的maindass(){
contains=新的MainDatasContains(){
featureCollection=新featureCollection(){
id=“UHL”,
边界比=999.9,
featureMembers=新列表(){
新功能成员(){
myClass1=新的myClass1(){
id=“XXX0001”
}
},
新功能成员(){
myClass2=新的myClass2(){
XmlSerializer serializer = new XmlSerializer(typeof(mainDatas));
XmlTextReader reader = new XmlTextReader(@".\myData.xml");
mainDatas dataObject = (mainDatas)serializer.Deserialize(reader);

FeaturePropertyType[] allObjects = dataObject.contain.FeatureCollection.featureMember;

foreach(FeaturePropertyType feature in allObjects)
{
   if (feature.Item != null && feature.Item.GetType() == typeof(myClass1))
   {
        this.doSomething((myClass1)feature.Item));
   }
   else
   {
        this.doSomethingElse();
   }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            MainDatas mainDatas = new MainDatas() {
                contains = new MainDatasContains() {
                    featureCollection = new FeatureCollection(){
                        id = "UHL",
                        boundedBy = 999.9,
                        featureMembers = new List<FeatureMember>() {
                            new FeatureMember() {
                                myClass1 = new MyClass1() {
                                    id = "XXX0001"
                                }
                            },
                            new FeatureMember() {
                                myClass2 = new MyClass2() {
                                    id = "XXX0001"
                                }
                            },
                            new FeatureMember() {
                                myClass1 = new MyClass1() {
                                    id = "XXX0003"
                                }
                            }

                        }
                    }
                }
            };


            XmlSerializer serializer = new XmlSerializer(typeof(MainDatas));

            StreamWriter writer = new StreamWriter(FILENAME);
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("aan", "http://www.andAnotherNamespace.com/");
            ns.Add("ons", "http://www.myOtherNamespace.com/");
            ns.Add("", "http://www.myNamespace.com/");

            serializer.Serialize(writer, mainDatas, ns);
            writer.Flush();
            writer.Close();
            writer.Dispose();

            XmlSerializer xs = new XmlSerializer(typeof(MainDatas));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            MainDatas newMainDatas = (MainDatas)xs.Deserialize(reader);
        }
    }
    [XmlRoot("mainDatas", Namespace = "http://www.myNamespace.com/")]   
    public class MainDatas
    {

        [XmlElement("contains")]
        public MainDatasContains contains { get; set; }
    }

    [XmlRoot("contains")]
    public class MainDatasContains
    {

        [XmlElement("FeatureCollection", Namespace = "http://www.myOtherNamespace.com/")]
        public FeatureCollection featureCollection { get; set; }
    }

    [XmlRoot(ElementName = "FeatureCollection")]
    public class FeatureCollection
    {
        [XmlAttribute("id", Namespace = "http://www.andAnotherNamespace.com/")]
        public string id { get; set; }

        [XmlElement("boundedBy", Namespace = "http://www.andAnotherNamespace.com/")]
        public double boundedBy { get; set; }

        [XmlElement("featureMember", Namespace = "http://www.andAnotherNamespace.com/")]
        public List<FeatureMember> featureMembers { get; set; }
    }

    [XmlRoot("featureMember")]
    public class FeatureMember
    {
        [XmlElement("myClass1")]
        public MyClass1 myClass1 { get; set; }

        [XmlElement("myClass2")]
        public MyClass2 myClass2 { get; set; }
    }

    [XmlRoot("myClass1")]
    public class MyClass1
    {
        [XmlAttribute("id", Namespace = "http://www.andAnotherNamespace.com/")]
        public string id { get; set; }

    }

    [XmlRoot("myClass2")]
    public class MyClass2
    {
        [XmlAttribute("id")]
        public string id { get; set; }

    }
}
​