我从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;
}
答案 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中。