我有以下XML文件,我试图使用DE-serialization读入c#中的一个类:
<?xml version="1.0"?>
<PropertiesMapping>
<Property>
<WEB_Class>InfoRequest</WEB_Class>
<COM_Class>CInfoReq</COM_Class>
<Mappings>
<Map>
<WEB_Property>theId</WEB_Property>
<COM_Property>TheID</COM_Property>
</Map>
<Map>
<WEB_Property>theName</WEB_Property>
<COM_Property>NewName</COM_Property>
</Map>
</Mappings>
</Property>
</PropertiesMapping>
以下是我正在使用的代码,虽然它没有错误地执行,但没有数据被读入类PropertiesMapping,我在哪里错了?
PropertiesMapping pm = null;
try
{
System.IO.StreamReader str = new System.IO.StreamReader(@"PropertyMapping.xml");
System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(PropertiesMapping));
pm = (PropertiesMapping)xSerializer.Deserialize(str);
str.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class PropertiesMapping
{
private string m_WEB_Class = "";
private string m_COM_Class = "";
private List<IndividualProperties> m_EachProperty = null;
public string WEB_Class
{
get
{
return m_WEB_Class;
}
set
{
m_WEB_Class = value;
}
}
public string COM_Class
{
get
{
return m_COM_Class;
}
set
{
m_COM_Class = value;
}
}
public IndividualProperties GetIndividualProperties(int iIndex)
{
return m_EachProperty[iIndex];
}
public void SetIndividualProperties(IndividualProperties theProp)
{
m_EachProperty.Add(theProp);
}
}
public class IndividualProperties
{
private string m_WEB_PropertyField;
private string m_COM_PropertyField;
public string WEB_Property
{
get
{
return this.m_WEB_PropertyField;
}
set
{
this.m_WEB_PropertyField = value;
}
}
public string COM_Property
{
get
{
return this.m_COM_PropertyField;
}
set
{
this.m_COM_PropertyField = value;
}
}
}
答案 0 :(得分:12)
您可以使用XmlElementAttribute
来简化您的C#命名。
表示当XmlSerializer序列化或反序列化包含它的对象时,公共字段或属性表示XML元素。
您需要对Mappings
元素使用XmlArrayItemAttribute
。
表示一个属性,指定XmlSerializer可以放置在序列化数组中的派生类型。
类:
[XmlType("PropertiesMapping")]
public class PropertyMapping
{
public PropertyMapping()
{
Properties = new List<Property>();
}
[XmlElement("Property")]
public List<Property> Properties { get; set; }
}
public class Property
{
public Property()
{
Mappings = new List<Mapping>();
}
[XmlElement("WEB_Class")]
public string WebClass { get; set; }
[XmlElement("COM_Class")]
public string ComClass { get; set; }
[XmlArray("Mappings")]
[XmlArrayItem("Map")]
public List<Mapping> Mappings { get; set; }
}
[XmlType("Map")]
public class Mapping
{
[XmlElement("WEB_Property")]
public string WebProperty { get; set; }
[XmlElement("COM_Property")]
public string ComProperty { get; set; }
}
演示:
PropertyMapping result;
var serializer = new XmlSerializer(typeof(PropertyMapping));
using(var stream = new StringReader(data))
using(var reader = XmlReader.Create(stream))
{
result = (PropertyMapping) serializer.Deserialize(reader);
}
答案 1 :(得分:0)
您无需显式声明属性。只需确保名称匹配。唯一的非默认部分是[XmlArrayItem("Map")]
属性,您需要使用地图数组的不同名称。
但是,您可以通过指定COM_Property
来为WEB_Property
和XmlElementAttribute
使用不同的名称。
class Program
{
static void Main(string[] args)
{
string testData = @"<?xml version=""1.0""?>
<PropertiesMapping>
<Property>
<WEB_Class>InfoRequest</WEB_Class>
<COM_Class>CInfoReq</COM_Class>
<Mappings>
<Map>
<WEB_Property>theId</WEB_Property>
<COM_Property>TheID</COM_Property>
</Map>
<Map>
<WEB_Property>theName</WEB_Property>
<COM_Property>NewName</COM_Property>
</Map>
</Mappings>
</Property>
</PropertiesMapping>";
var sr = new System.IO.StringReader(testData);
var xs = new XmlSerializer(typeof(PropertiesMapping));
object result = xs.Deserialize(sr);
}
}
[Serializable]
public class PropertiesMapping
{
public Property Property { get; set; }
}
[Serializable]
public class Property
{
[XmlElement("WEB_Class")]
public string WebClass { get; set; }
[XmlElement("COM_Class")]
public string ComClass { get; set; }
[XmlArrayItem("Map")]
public Mapping[] Mappings { get; set; }
}
[Serializable]
public class Mapping
{
[XmlElement("WEB_Property")]
public string WebProperty { get; set; }
[XmlElement("COM_Property")]
public string ComProperty { get; set; }
}
答案 2 :(得分:0)
根据您尝试实现的目标,使用XDocument
和Linq-to-XML可以更轻松地完成。
就序列化而言,这里有一个类结构:
public class PropertiesMapping{
[XmleElement]
public string WEB_Class {get;set;}
[XmleElement]
public string COM_Class{get;set;}
[XmlArray("Mappings")]
public Map[] Mappings {get;set;}
}
public class Map{
[XmleElement]
public string WEB_Property{get;set;}
[XmleElement]
public string COM_Property{get;set;}
}