【问题标题】:How do I quickly deserialize XML into a type?如何快速将 XML 反序列化为类型?
【发布时间】:2010-04-16 16:52:27
【问题描述】:

假设我有这个 XML 作为字符串:

<calles>
  <calle>
   <nombre>CALLAO AV.</nombre>
   <altura>1500</altura>
   <longitud>-58.3918617027</longitud>
   <latitud>-34.5916734896</latitud>
   <barrio>Recoleta</barrio>
  </calle>
 </calles>

我创建了这个类型来映射那个 XML:

public class Ubicacion
{
    public string Latitud { get; set; }
    public string Longitud { get; set; }
    public string Nombre { get; set; }
    public string Altura { get; set; }
    public string Barrio { get; set; }

    public Ubicacion() { }
}

我需要获取那个 XML 文件并使用这些值创建一个对象...

有人知道快速的方法吗?用 C#?我一直在尝试这个,但根本不工作......

XElement dir = XElement.Parse(text);

Ubicacion informacion = from d in dir.Elements("calle").
        select new Ubicacion
        {
           Longitud = d.Element("longitud").Value,
           Latitud = d.Element("latitud").Value,
           Altura = d.Element("altura").Value,
           Nombre = d.Element("nombre").Value,
           Barrio = d.Element("barrio").Value,
        };
return informacion.Cast<Ubicacion>();

有什么想法吗?

【问题讨论】:

    标签: c# xml linq xml-deserialization


    【解决方案1】:

    你试过了吗?

     XElement dir = XElement.Parse(text); 
    
            var informacion = from d in dir.Elements("calle"). 
                              select new Ubicacion 
                              { 
                                  Longitud = d.Element("longitud").Value, 
                                  Latitud = d.Element("latitud").Value, 
                                  Altura = d.Element("altura").Value, 
                                  Nombre = d.Element("nombre").Value, 
                                  Barrio = d.Element("barrio").Value, 
                              }.ToList();
    

    请记住,LINQ 查询在您遍历它之前不会执行。 .ToList() 扩展方法将为您做到这一点。然后它将生成一个List&lt;Ubicacion&gt; 集合。

    【讨论】:

    • 不应该是List&lt;Ubication&gt; informacion = from...吗?
    • 是的。我实际上修改为 var,无论如何我通常会在这种情况下使用它。
    【解决方案2】:

    一种方法是这样的:

    • 通过xsd.exe 运行您的data.xml 两次-首先使用xsd.exe (filename).xml,这将为您的XML 文件生成一个具有相同名称和.xsd 文件扩展名的XML 架构
    • 其次,运行xsd.exe /c (filename).xsd,它将生成一个与您的 XML 对应的 C# 类
    • 现在,您可以轻松地将 XML 反序列化为 C# 类
    • 设置 AutoMapper 以轻松地将生成/反序列化的类映射到目标类型的实例 - 由于两种类型具有相同的属性名称,因此设置 AutoMapper 是一件轻而易举的事:

      Mapper.CreateMap<Deserialized, Ubicacion>();
      Ubicacion target = Mapper.Map<Deserialized, Ubicacion>(your-deserialized-instance);
      

      这就是所有要做的事情!

    根据您需要执行此操作的次数,这可能比手动将 XML 解析成点点滴滴并根据该解析组装新对象实例更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 2023-04-08
      • 1970-01-01
      • 2018-01-09
      • 2023-03-03
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多