c#XML序列化使用不同名称空间的派生类
我试图读取一个xml文件并将其反序列化到我的InsertSensorType类,然后读取VALUE1、VALUE2。我尝试将XmlElement名称添加到InsertSensorTypeMetadata类中的InsertionMetadata属性中,但无效。我已搜索并找到解决方案,但它们对该问题无效。谁能告诉我我做错了什么 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 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);
}
}