Xml元素不存在,列表null和Object引用未设置为对象的实例

时间:2014-01-23 10:37:22

标签: c# xml linq list linq-to-xml

我从xml字段中退出数据,有些节点可能不存在(因为xml文件是动态生成的)。问题是,当我查找一个节点并且它不存在于文件中时,它返回一个空列表和此异常:“d对象引用未设置为对象的实例”。 这是代码:

public static List<Transaction> getXmlTransactions(XElement n)
        {


            var transactions = n.Elements("Transaktion").Select(p => new Transaction()
                {
                    TransID = p.Element("TransID") != null ? p.Element("TransID").Value : String.Empty,
                    TypeTransaction = p.Element("TransArt") != null ? p.Element("TransArt").Value : String.Empty,
                    DateEntree = p.Element("BuchDat") != null ? p.Element("BuchDat").Value : String.Empty,
                    Montant = p.Element("BetragWAE") != null ? p.Element("BetragWAE").Value : String.Empty,
                    Devise = p.Element("BuchDat") != null ? p.Element("Waehrung").Value : String.Empty,
                    // BanqueCorespondante = p.Element("BuchDat") != null ? p.Element("Waehrung").Value : String.Empty,   Dans le compte
                    Pays = p.Element("GegenLandText") != null ? p.Element("GegenLandText").Value : String.Empty,
                    AbreviationPays = p.Element("GegenLand") != null ? p.Element("GegenLand").Value : String.Empty,
                    autresinfo = p.Element("Kommentar") != null ? p.Element("Kommentar").Value : String.Empty
                }).ToList();


                return transactions;



        } 

 public static List<Compte> getXmlComptes(XElement n)
        {


            var comptes = n.Elements("Konto").Select(p => new Compte()
            {
                NumCompte = p.Element("KtoNr") != null ? p.Element("KtoNr").Value : String.Empty,
                typeCompte = p.Element("KontoArt") != null ? p.Element("KontoArt").Value : String.Empty,
                DateOuverture = p.Element("KtoOeff") != null ? p.Element("KtoOeff").Value : String.Empty,
                IBAN = p.Element("IBAN") != null ? p.Element("IBAN").Value : String.Empty,
                Devise = p.Element("Waehrung") != null ? p.Element("Waehrung").Value : String.Empty,
                CommentairesCompte = p.Element("Kommentar") != null ? p.Element("Kommentar").Value : String.Empty,
                Trans = getXmlTransactions(p)
            }).ToList();


                return comptes;

        }

1 个答案:

答案 0 :(得分:0)

从您提供的代码我可以说,您正在将null传递给getXmlComptes方法(如果在其他地方调用,则传递给getXmlTransactions。)

我建议你投射元素:

public static List<Transaction> getXmlTransactions(XElement n)
{
   if (n == null)
       throw new ArgumentNullException("Konto is null");

    var transactions = from t in n.Elements("Transaktion")
                       select new Transaction {
                           TransID = (string)t.Element("TransID"),
                           TypeTransaction = (string)t.Element("TransArt"),
                           DateEntree = (string)t.Element("BuchDat"),
                           Montant = (string)t.Element("BetragWAE"),
                           Devise = (string)t.Element("BuchDat"),
                           Pays = (string)t.Element("GegenLandText"),
                           AbreviationPays = (string)t.Element("GegenLand"),
                           autresinfo = (string)t.Element("Kommentar")
                       };

    return transactions.ToList();
}

第二种方法:

public static List<Compte> getXmlComptes(XElement n)
{
   if (n == null)
       throw new ArgumentNullException("Something is null");

    var comptes = from k in n.Elements("Konto")
                  select new Compte
                  {
                      NumCompte = (string)k.Element("KtoNr"),
                      typeCompte = (string)k.Element("KontoArt"),
                      DateOuverture = (string)k.Element("KtoOeff"),
                      IBAN = (string)k.Element("IBAN"),
                      Devise = (string)k.Element("Waehrung"),
                      CommentairesCompte = (string)k.Element("Kommentar"),
                      Trans = getXmlTransactions(k)
                  };

    return comptes.ToList();
}

运行此代码,您将看到您正在通过null。如果需要将空字符串分配给某个属性,如果xml中缺少元素,则使用null-coalescing运算符:

TypeTransaction = (string)t.Element("TransArt") ?? ""

但我会将属性值保持为null,以表明它不在xml中。