【问题标题】:Trying to Use XDocument and LINQ尝试使用 XDocument 和 LINQ
【发布时间】:2016-04-13 11:05:16
【问题描述】:

我仍在学习如何使用 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&lt;PrxComissao&gt; 做的是获取所有元素并分配它们。

这是我的课

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 Select 是否正确?或者,还有更好的方法 ?

【问题讨论】:

  • 如果您需要有关FromXElement&lt;PrxComissao&gt;() 方法代码的帮助,那么您需要向我们展示该方法...
  • 我的错,已经贴出来了

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


【解决方案1】:

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

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

【讨论】:

  • 在感谢您抽出宝贵时间之前,它确实已经发布了。但是根据您的回答,它仍然返回 count = 0 找不到我猜的任何元素
  • @user3584562,当我在 LInqPad 中使用你的 xml 和我的代码时,我得到了元素。
  • @user3584562,har07 是对的,相应地编辑了我的。
【解决方案2】:

目前,您的代码将&lt;PrxComissao&gt; 的各个子元素传递给转换器方法。我相信你想通过 XElement 引用 &lt;PrxComissao&gt; 来代替:

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

另外,你的类使用属性而不是字段,所以这里应该使用的对应反射方法是GetProperty(),而不是GetField()

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2012-06-15
    • 2022-07-02
    • 1970-01-01
    相关资源
    最近更新 更多