【问题标题】:How to parse through XML and create object in C# [duplicate]如何通过 XML 解析并在 C# 中创建对象 [重复]
【发布时间】:2019-11-20 04:12:46
【问题描述】:

我想从下面的 XML 创建白名单对象列表。

创建了一个类白名单

class WhiteList
{
    public string ID { get; set; }
    public string From { get; set; }
    public string To { get; set; }
}

我需要从 XML 中创建对象列表

<Response>
  <list>
    <whitelist>
      <id>1234</id>
      <from>sdfkmsfk@wfgtitleco.com</from>
      <to>dsfgsdf@loansdfglosers.com</to>
    </whitelist>
    <whitelist>
      <id>1452</id>
      <from>mdsfgaursdfgdfmimi@gmail.com</from>
      <to>dfsgdscew@loansdfglosers.com</to>
    </whitelist>
    <whitelist>
      <id>9483</id>
      <from>prvs=17958ac559=dmcclain@wfgtitleco.com</from>
      <to>status@loansdfglosers.com</to>
    </whitelist>
    <whitelist>
      <id>5654</id>
      <from>ewrgre@loansdfglosers</from>
      <to>werferw@loansdfglosers.com</to>
    </whitelist>
  </list>
</Response>

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    这是一个使用 XML 文档的简单示例:

    public static List<WhiteList> CreateObjects(XDocument xmldoc)
    {
        var query = from data in xmldoc.Descendants("whitelist")
                    select new WhiteList
                    {
                        ID = (string)data.Element("id"),
                        From = (string)data.Element("from"),
                        To = (string)data.Element("to"),
                    };
    
        var list = query.ToList();
        List<WhiteList> result = new List<WhiteList>();
        // now create the desierd list
        foreach (var x in list)
        {
            WhiteList ws = new WhiteList();
            ws.ID = x.ID;
            ws.From = x.From;
            ws.To = x.To;
            result.Add(ws);
        }
    
        return result;
    }
    

    【讨论】:

    • 也许提问者应该考虑创建一个 xsd 架构。
    • @DrkDeveloper 为什么? OP 已经获得了这一步的代码......然后 OP 可以问另一个问题......(更严重的是,为什么您认为 XSD 会帮助解析?)
    • @AlexeiLevenkov 不解析,它有助于使 xml 文件与您需要的结构保持一致。
    【解决方案2】:

    我创建的一个通用类,用于将 XML 序列化和反序列化为 .net 对象,反之亦然。

    您需要添加一个辅助类,如下所示。只需将命名空间更改为您的项目即可。

     using System.IO;
    using System.Xml.Serialization;
    
    namespace YourProject
    {
    public class XMLParser<T> where T : class
    {
    
        public static T Deserialize(string path)
        {
            T item;
            try
            {
                var serializer = new XmlSerializer(typeof(T));
                using (var reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    item = (T)serializer.Deserialize(reader);
    
                    reader.Dispose();
                }
            }
            catch (System.Exception)
            {
    
                throw;
            }
            return item;
        }
    
    
        public static void Serialize(object item, string path)
        {
            var serializer = new XmlSerializer(typeof(T));
            using (var fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                using (var writer = new StreamWriter(fs))
                {
                    serializer.Serialize(writer, item);
                    writer.Close();
                    writer.Dispose();
                }
            }
        }
    }
    }
    

    现在你的班级不抱怨 XML,所以你需要稍微改变你的班级。

    class Response{
     public List<WhiteList> list{get; set;}
    }
    class WhiteList{
    public string ID {get;set;}
    public string From {get;set;}
    public string To {get;set;}
    }
    

    现在您可以调用 XMLParser 类来序列化或反序列化 XML 或 .net 对象。 下面是电话

    只需提供 XML 的路径

    Response response = XMLParser<Response>.Deserialize([path of XML]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多