使用序列化从XML文件读入C#类

时间:2013-08-20 16:34:56

标签: c# xml

我有以下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;
            }
        }
    }

3 个答案:

答案 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_PropertyXmlElementAttribute使用不同的名称。

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