1

我有这个现有的 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

我想就是这样。

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

4

2 回答 2

3

您可以使用序列化来实现(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();
        }
    }
于 2013-07-08T11:36:12.213 回答
1

我会创建类:

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

于 2013-07-08T11:37:29.947 回答