【问题标题】:How to map an object to an existing XML file in C# .NET?如何将对象映射到 C# .NET 中的现有 XML 文件?
【发布时间】:2013-07-05 17:10:49
【问题描述】:

我有这个现有的 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# .net xml object mapping


    【解决方案1】:

    可以使用序列化来实现(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();
            }
        }
    

    【讨论】:

      【解决方案2】:

      我会创建类:

      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

      【讨论】:

        猜你喜欢
        • 2012-03-09
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2012-04-11
        • 2021-04-13
        • 1970-01-01
        相关资源
        最近更新 更多