c#XML序列化使用不同名称空间的派生类

c#XML序列化使用不同名称空间的派生类,c#,xml,xml-serialization,derived-class,xml-deserialization,C#,Xml,Xml Serialization,Derived Class,Xml Deserialization,我试图读取一个xml文件并将其反序列化到我的InsertSensorType类,然后读取VALUE1、VALUE2。我尝试将XmlElement名称添加到InsertSensorTypeMetadata类中的InsertionMetadata属性中,但无效。我已搜索并找到解决方案,但它们对该问题无效。谁能告诉我我做错了什么 Xml文件: <?xml version="1.0" encoding="utf-8" ?> <swes:InsertSensor xml

我试图读取一个xml文件并将其反序列化到我的InsertSensorType类,然后读取VALUE1、VALUE2。我尝试将XmlElement名称添加到InsertSensorTypeMetadata类中的InsertionMetadata属性中,但无效。我已搜索并找到解决方案,但它们对该问题无效。谁能告诉我我做错了什么

Xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<swes:InsertSensor     
    xmlns:swes="http://www.opengis.net/swes/2.0"
    xmlns:sos="http://www.opengis.net/sos/2.0" >
  <swes:metadata>
    <sos:SosInsertionMetadata>
      <sos:observationType>VALUE1</sos:observationType>
      <sos:observationType>VALUE2</sos:observationType>
      <sos:featureOfInterestType>VALUE3</sos:featureOfInterestType>
      <sos:featureOfInterestType>VALUE4</sos:featureOfInterestType>
    </sos:SosInsertionMetadata>
  </swes:metadata>
</swes:InsertSensor>
这是我的主要代码:

 static void Main(string[] args)
        {
            XmlElement xmlRequest = null;
            XmlDocument doc = new XmlDocument();
            doc.Load("request.xml");
            xmlRequest = doc.DocumentElement;
            executeRequest(xmlRequest);
        }

        static void executeRequest(XmlElement xmlRequest)
        {
            InsertSensorType insertSensorRequest = ValidateRequest<InsertSensorType>(xmlRequest);

            InsertSensorTypeMetadata[] _InsertSensorTypeMetadata = insertSensorRequest.metadata; 
            Console.WriteLine("Length of metadata :" + _InsertSensorTypeMetadata.Length);//1
            foreach (InsertSensorTypeMetadata istm in _InsertSensorTypeMetadata)
            {

                SosInsertionMetadataType sos = istm.InsertionMetadata as SosInsertionMetadataType;
                //sos is null

            }
            Console.Read();
        }

        static T ValidateRequest<T>(XmlElement xmlRequest) where T : class
        {
            string xml = xmlRequest.OuterXml;
            StringReader reader = new StringReader(xml);
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            //XmlSerializer serializer = new XmlSerializer(typeof(T), new Type[] { typeof(SosInsertionMetadataType) });
            T typeInstance = (T)serializer.Deserialize(reader);

            return typeInstance;
        }
static void Main(字符串[]args)
{
XmlElement xmlRequest=null;
XmlDocument doc=新的XmlDocument();
doc.Load(“request.xml”);
xmlRequest=doc.DocumentElement;
executeRequest(xmlRequest);
}
静态void executeRequest(XmlElement xmlRequest)
{
InsertSensorType insertSensorRequest=ValidateRequest(xmlRequest);
InsertSensorTypeMetadata[]\u InsertSensorTypeMetadata=insertSensorRequest.metadata;
Console.WriteLine(“元数据的长度:+\u InsertSensorTypeMetadata.Length);//1
foreach(InsertSensorTypeMetadata中的InsertSensorTypeMetadata istm)
{
SosInsertionMetadataType sos=istm.InsertionMetadata作为SosInsertionMetadataType;
//sos为空
}
Console.Read();
}
静态T ValidateRequest(XmlElement xmlRequest),其中T:class
{
字符串xml=xmlRequest.OuterXml;
StringReader=新的StringReader(xml);
XmlSerializer serializer=新的XmlSerializer(typeof(T));
//XmlSerializer serializer=新的XmlSerializer(typeof(T),new Type[]{typeof(SosInsertionMetadataType)});
T typeInstance=(T)序列化程序。反序列化(读取器);
返回类型实例;
}
试试这个

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            InsertSensorType insertSensorType = new InsertSensorType() {
                metadata = new Metadata() {
                    insertSensorTypeMetadata = new InsertSensorTypeMetadata() {
                        InsertionMetadata = new List<InsertionMetadataType>() {
                            new ObservationType() { value = "Value1"},
                            new ObservationType() { value = "Value2"},
                            new FeatureOfInterestType() { value = "Value3"},
                            new FeatureOfInterestType() { value = "Value4"}
                        }
                    }
                }
            };
            XmlSerializer serializer = new XmlSerializer(typeof(InsertSensorType));
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("swes","http://www.opengis.net/swes/2.0");
            ns.Add("sos","http://www.opengis.net/sos/2.0");

            StreamWriter writer = new StreamWriter(FILENAME);
            serializer.Serialize(writer, insertSensorType, ns);
            writer.Flush();
            writer.Close();
            writer.Dispose();

            XmlSerializer xs = new XmlSerializer(typeof(InsertSensorType));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            InsertSensorType newInsertSensorType = (InsertSensorType)xs.Deserialize(reader);

        }

    }
    [XmlRoot(ElementName = "InsertSensor")]
    public class InsertSensorType
    {
        [XmlElement("metadata")]
        public Metadata metadata { get; set; }
    }
    [XmlRoot("metadata", Namespace = "http://www.opengis.net/swes/2.0")]
    public class Metadata
    {
        [XmlElement("SosInsertionMetadata")]
        public InsertSensorTypeMetadata insertSensorTypeMetadata { get; set; }
    }

    [XmlRoot("SosInsertionMetadata", Namespace = "http://www.opengis.net/sos/2.0")]
    public class InsertSensorTypeMetadata
    {
         [XmlElement()]
         public List<InsertionMetadataType> InsertionMetadata { get; set; }

    }

    [XmlInclude(typeof(ObservationType))]
    [XmlInclude(typeof(FeatureOfInterestType))]
    [Serializable]
    [XmlRoot(Namespace = "http://www.opengis.net/sos/2.0")]
    public class InsertionMetadataType
    {
        public string value { get; set; }
    }
    [Serializable]
    [XmlRoot(ElementName = "observationType", Namespace = "http://www.opengis.net/sos/2.0")]
    public class ObservationType : InsertionMetadataType
    {

    }
    [Serializable]
    [XmlRoot(ElementName = "featureOfInterestType", Namespace = "http://www.opengis.net/sos/2.0")]
    public class FeatureOfInterestType : InsertionMetadataType
    {

    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
InsertSensorType InsertSensorType=新的InsertSensorType(){
元数据=新元数据(){
insertSensorTypeMetadata=新的insertSensorTypeMetadata(){
InsertionMetadata=新列表(){
新的ObservationType(){value=“Value1”},
新的ObservationType(){value=“Value2”},
新特性OfInterestType(){value=“Value3”},
新特性OfInterestType(){value=“Value4”}
}
}
}
};
XmlSerializer serializer=新的XmlSerializer(typeof(InsertSensorType));
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
ns.添加(“swes”http://www.opengis.net/swes/2.0");
添加(“sos”http://www.opengis.net/sos/2.0");
StreamWriter writer=新的StreamWriter(文件名);
serializer.Serialize(writer,insertSensorType,ns);
writer.Flush();
writer.Close();
writer.Dispose();
XmlSerializer xs=新的XmlSerializer(typeof(InsertSensorType));
XmlTextReader=新的XmlTextReader(文件名);
InsertSensorType newInsertSensorType=(InsertSensorType)xs.反序列化(读取器);
}
}
[XmlRoot(ElementName=“InsertSensor”)]
公共类InsertSensorType
{
[XmlElement(“元数据”)]
公共元数据{get;set;}
}
[XmlRoot(“元数据”,命名空间=”http://www.opengis.net/swes/2.0")]
公共类元数据
{
[XmlElement(“SosInsertionMetadata”)]
公共InsertSensorTypeMetadata InsertSensorTypeMetadata{get;set;}
}
[XmlRoot(“SosInsertionMetadata”,命名空间=”http://www.opengis.net/sos/2.0")]
公共类InsertSensorTypeMetadata
{
[XmlElement()]
公共列表插入元数据{get;set;}
}
[xmlclude(typeof(ObservationType))]
[xmlclude(typeof(FeatureOfInterestType))]
[可序列化]
[XmlRoot(命名空间=”http://www.opengis.net/sos/2.0")]
公共类InsertionMetadataType
{
公共字符串值{get;set;}
}
[可序列化]
[XmlRoot(ElementName=“observationType”,命名空间=”http://www.opengis.net/sos/2.0")]
公共类ObservationType:InsertionMetadataType
{
}
[可序列化]
[XmlRoot(ElementName=“featureOfInterestType”,命名空间=”http://www.opengis.net/sos/2.0")]
兴趣类型的公共类功能:InsertionMetadataType
{
}
}
​
试试这个

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            InsertSensorType insertSensorType = new InsertSensorType() {
                metadata = new Metadata() {
                    insertSensorTypeMetadata = new InsertSensorTypeMetadata() {
                        InsertionMetadata = new List<InsertionMetadataType>() {
                            new ObservationType() { value = "Value1"},
                            new ObservationType() { value = "Value2"},
                            new FeatureOfInterestType() { value = "Value3"},
                            new FeatureOfInterestType() { value = "Value4"}
                        }
                    }
                }
            };
            XmlSerializer serializer = new XmlSerializer(typeof(InsertSensorType));
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("swes","http://www.opengis.net/swes/2.0");
            ns.Add("sos","http://www.opengis.net/sos/2.0");

            StreamWriter writer = new StreamWriter(FILENAME);
            serializer.Serialize(writer, insertSensorType, ns);
            writer.Flush();
            writer.Close();
            writer.Dispose();

            XmlSerializer xs = new XmlSerializer(typeof(InsertSensorType));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            InsertSensorType newInsertSensorType = (InsertSensorType)xs.Deserialize(reader);

        }

    }
    [XmlRoot(ElementName = "InsertSensor")]
    public class InsertSensorType
    {
        [XmlElement("metadata")]
        public Metadata metadata { get; set; }
    }
    [XmlRoot("metadata", Namespace = "http://www.opengis.net/swes/2.0")]
    public class Metadata
    {
        [XmlElement("SosInsertionMetadata")]
        public InsertSensorTypeMetadata insertSensorTypeMetadata { get; set; }
    }

    [XmlRoot("SosInsertionMetadata", Namespace = "http://www.opengis.net/sos/2.0")]
    public class InsertSensorTypeMetadata
    {
         [XmlElement()]
         public List<InsertionMetadataType> InsertionMetadata { get; set; }

    }

    [XmlInclude(typeof(ObservationType))]
    [XmlInclude(typeof(FeatureOfInterestType))]
    [Serializable]
    [XmlRoot(Namespace = "http://www.opengis.net/sos/2.0")]
    public class InsertionMetadataType
    {
        public string value { get; set; }
    }
    [Serializable]
    [XmlRoot(ElementName = "observationType", Namespace = "http://www.opengis.net/sos/2.0")]
    public class ObservationType : InsertionMetadataType
    {

    }
    [Serializable]
    [XmlRoot(ElementName = "featureOfInterestType", Namespace = "http://www.opengis.net/sos/2.0")]
    public class FeatureOfInterestType : InsertionMetadataType
    {

    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
InsertSensorType InsertSensorType=新的InsertSensorType(){
元数据=新元数据(){
insertSensorTypeMetadata=新的insertSensorTypeMetadata(){
InsertionMetadata=新列表(){
新的ObservationType(){value=“Value1”},
新的ObservationType(){value=“Value2”},
新特性OfInterestType(){value=“Value3”},
新特性OfInterestType(){value=“Value4”}
}
}
}
};
XmlSerializer serializer=新的XmlSerializer(typeof(InsertSensorType));
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
ns.添加(“swes”http://www.opengis.net
[System.Xml.Serialization.XmlElement(ElementName = "SosInsertionMetadata", Type = typeof(SosInsertionMetadataType), Namespace = "http://www.opengis.net/sos/2.0")] // added 
public static T ValidateRequest<T>(XmlElement element) where T : class
{
    var serializer = new XmlSerializer(typeof(T));

    return (T)serializer.Deserialize(new XmlNodeReader(element));
}
static void executeRequest(XmlElement xmlRequest)
{
    InsertSensorType insertSensorRequest = ValidateRequest<InsertSensorType>(xmlRequest);
    foreach (InsertSensorTypeMetadata istm in insertSensorRequest.metadata)
    {
        SosInsertionMetadataType sos = (SosInsertionMetadataType)istm.InsertionMetadata;
        foreach(string s in sos.featureOfInterestType)
            Console.WriteLine(s);

        foreach (string s in sos.observationType)
            Console.WriteLine(s);

    }
}