如何在C#中将对象映射到现有的XML文件

本文关键字:文件 XML 映射 对象 | 更新日期: 2023-09-27 18:21:23

我有一个现有的XML文件作为模板,没有数据,只有简单的节点。。。这是一个样品:

<?xml version="1.0" encoding="utf-8" ?>
<catalog>
  <cd>
    <title />
    <artist />
    <country />
    <company />
    <price />
    <year />
  </cd>
</catalog>

现在我为它创建了一个类似的类。

public class Cd
    {
        public string Title { get; set; }
        public string Artist { get; set; }
        public string Country { get; set; }
        public string Company { get; set; }
        public string Price { get; set; }
        public string Year { get; set; }
    }

目的是:

  1. var cd = new Cd();对象的属性设置值
  2. 获取现有的XML文件(模板),然后传递其中的值(例如将对象映射到现有的XML)
  3. 将XML模板(带值)转换为XSLT以成为HTML

我想仅此而已。

如何正确地做到这一点?非常感谢!

如何在C#中将对象映射到现有的XML文件

您可以使用序列化来实现(1)和(2)

[Serializable]
    public class Cd
    {
        public string Title { get; set; }
        public string Artist { get; set; }       
        public string Country { get; set; }
        public string Company { get; set; }
        public string Price { get; set; }
        public string Year { get; set; }
    }

现在为了从对象创建xml,请使用:

    public static string SerializeObject<T>(this T obj)
    {
        var ms = new MemoryStream();
        var xs = new XmlSerializer(obj.GetType());
        var xmlTextWriter = new XmlTextWriter(ms, Encoding.UTF8);
        xs.Serialize(xmlTextWriter, obj);
        string serializedObject = new UTF8Encoding().GetString((((MemoryStream)xmlTextWriter.BaseStream).ToArray()));
        return serializedObject;
    }

为了从XML中创建对象,请使用:

public static T DeserializeObject<T>(this string xml)
    {
        if (xml == null)
            throw new ArgumentNullException("xml");
        var xs = new XmlSerializer(typeof(T));
        var ms = new MemoryStream(new UTF8Encoding().GetBytes(xml));
        try
        {
            new XmlTextWriter(ms, Encoding.UTF8);
            return (T)xs.Deserialize(ms);
        }
        catch
        {
            return default(T);
        }
        finally
        {
            ms.Close();
        }
    }

我会创建类:

class catalog
{
    public CD cd {get;set;}
}

这里是序列化和取消实现的帮助程序:

public class Xml
{
    public static string Serialize<T>(T value) where T : class
    {
        if (value == null)
        {
            return string.Empty;
        }
        var xmlSerializer = new XmlSerializer(typeof(T));
        var stringWriter = new StringWriter();
        using (var xmlWriter = XmlWriter.Create(stringWriter))
        {
            xmlSerializer.Serialize(xmlWriter, value);
            return stringWriter.ToString();
        }
    }
    public static T Deserialize<T>(string xml)
    {
        var serializer = new XmlSerializer(typeof(T));
        T result;
        using (TextReader reader = new StringReader(xml))
        {
            result = (T) serializer.Deserialize(reader);
        }
        return result;
    }
}

只需拨打:

catalog catalogObject = Xml.Deserialize<catalog>(xmlCatalogString);

我怀疑您还需要在XmlElement(ElementName="title")等属性上添加一些属性,因为它区分大小写。

MSDN