试图使用XDocument和LINQ

时间:2016-04-13 11:05:16

标签: c# .net xml linq-to-xml

我还在学习如何使用LINQ,现在我正在努力应对这种情况。

我有这个XML文件(示例)

<Results>
  <PrxComissao>
    <Id>0</Id>
    <NumErro>0</NumErro>
    <RetCode>0</RetCode>
    <IdEvento>0</IdEvento>
    <ExecutionTimeMilliseconds>63596143450994.227</ExecutionTimeMilliseconds>
    <ExecutionTimeSeconds>63596143450.994225</ExecutionTimeSeconds>
    <CodComissao>CFE</CodComissao>
    <Montante>20.00</Montante>
    <Percentagem>0.0000</Percentagem>
    <MntMin>0.00</MntMin>
    <MntMax>0.00</MntMax>
    <Nome>CFE</Nome>
    <Descricao>Custo Factura Estrangeiro</Descricao>
  </PrxComissao>
  <PrxComissao>
    <Id>0</Id>
    <NumErro>0</NumErro>
    <RetCode>0</RetCode>
    <IdEvento>0</IdEvento>
    <ExecutionTimeMilliseconds>63596143450994.227</ExecutionTimeMilliseconds>
    <ExecutionTimeSeconds>63596143450.994225</ExecutionTimeSeconds>
    <CodComissao>CFE</CodComissao>
    <Montante>20.00</Montante>
    <Percentagem>0.0000</Percentagem>
    <MntMin>13.00</MntMin>
    <MntMax>123.00</MntMax>
    <Nome>CFE</Nome>
    <Descricao>www</Descricao>
  </PrxComissao>
</Results>

现在我要做的是获取“PrxComissao”中的所有XML元素,然后将它们分配给我的班级。这是我正在尝试的代码

XDocument xDoc = XDocument.Parse(resultado);

List<PrxComissao> lstPrxComissao = xDoc.Elements("Results")
                                       .Elements("PrxComissao")
                                       .Elements()
                                       .Select(BL_CartaoCredito.Utils.Data.Converter.FromXElement<PrxComissao>)
                                       .ToList();

ObjAuxResult = lstPrxComissao;

我要对此Converter.FromXElement<PrxComissao>做的是获取所有元素并分配它们。

这是我的班级

public class PrxComissao
{

    public string CodComissao { get; set; }
    public string Montante { get; set; }
    public string Percentagem { get; set; }
    public string MntMin { get; set; }
    public string MntMax { get; set; }
    public string Nome { get; set; }
    public string Descricao { get; set; }
    public string TipoImposto { get; set; }
    public string ComFinanciamento { get; set; }
    public string iActivo { get; set; }
    public string UtlModificacao { get; set; }
    public string DtModificacao { get; set; }
    public string UtlCriacao { get; set; }
    public string DtCriacao { get; set; }
}

public static T FromXElement<T>(XElement element) where T : class, new()
{

    T value = new T();

    foreach (var subElement in element.Elements())
    {

        var field = typeof(T).GetField(subElement.Name.LocalName);
        field.SetValue(value, (string)subElement);
    }

    return value;
}

所以现在我有两个问题。首先,我无法访问PrxComissao内的元素总是不返回任何内容然后我的LINQ选择正确吗?或者,还有更好的方法 ?

2 个答案:

答案 0 :(得分:1)

Descendants开始,假设您的转换器采用XElement:

List<PrxComissao> lstPrxComissao = xDoc.Descendants()
                                       .Elements("PrxComissao")
                                       .Select(el => BL_CartaoCredito.Utils.Data.Converter.FromXElement<PrxComissao>(el))
                                       .ToList();

然后(未经测试)......

public static T FromXElement<T>(XElement element) where T : class, new() 
{
    var typeOfT = typeof(T);
    T value = new T();
    foreach (var subElement in element.Elements())
    {
        var prop = typeOfT.GetProperty(subElement.Name.LocalName);
        if(prop != null)
        {
            prop.SetValue(value, subElement.Value);
        }
     }
        return value;
 }

答案 1 :(得分:1)

目前,您的代码会将<PrxComissao>的各个子元素传递给转换器方法。我相信你想传递引用XElement的{​​{1}}代替:

<PrxComissao>

此外,你的类使用属性而不是字段,因此这里应该使用的相应反射方法是List<PrxComissao> lstPrxComissao = xDoc.Elements("Results") .Elements("PrxComissao") .Select(o => BL_CartaoCredito.Utils .Data .Converter .FromXElement<PrxComissao>(o) ) .ToList(); ,而不是GetProperty()