2016-04-13 6 views
1

Я все еще учась использовать LINQ, и теперь я борюсь с этой ситуацией.Пытаясь использовать XDocument и 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> 

А теперь то, что я хочу сделать, это получить все XML-элементы внутри «PrxComissao», а затем назначить их в мой класс. Это код, который я пытался

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 Выберите правильный? Или есть лучший способ?

+0

Если вам нужна помощь с кодами для 'FromXElement ()' метода, то вам нужно, чтобы показать нам, что метод ... – har07

+0

Моя ошибка, уже отправил его – user3584562

ответ

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; 
} 
+0

Прежде чем что-нибудь спасибо за ваше время и это делает, уже отправил его. Но с вашим ответом он все еще возвращает count = 0 can not find any elements i guess – user3584562

+0

@ user3584562, см. Edit. – Crowcoder

+0

@ user3584562, я получаю элементы, когда я использую ваш xml и мой код в LInqPad. – Crowcoder

1

В настоящее время код проходит отдельные дочерние элементы <PrxComissao> к преобразователю метод. Я считаю, что вы хотите передать XElement, который ссылается <PrxComissao> вместо:

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

Кроме того, ваш класс использует свойства вместо поля, поэтому соответствующий метод отражения предполагается использовать здесь GetProperty(), не GetField().

Смежные вопросы