我正在填写XML文件中的列表。某些节点可能不存在,这会导致异常,因为它返回null。这是代码:
public static List<Compte> getXmlComptes(string pathXml)
{
var doc = XDocument.Load(pathXml);
var comptes = doc.Descendants("Anzeige").Descendants("Kunde").Descendants("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,
Trans = getXmlTransactions(pathXml)
}).ToList();
return comptes;
}
如何在将项目添加到列表之前进行控制。谢谢。
xml文件的例子:
<Anzeige>
<Kunde>
<IdClient>ppp</IdClient>
<Konto>
<NumCompte>258</NumCompte>
<Transaction>
<idTrans>85555</idTrans>
<type>blebleble</type>
</Transaction>
<Transaction>
<idTrans>85555</idTrans>
<type>blebleble</type>
</Transaction>
</Konto>
</Kunde>
</Anzeige>
getXmlTransaction的代码:
public static List<Transaction> getXmlTransactions(string pathXml)
{
var doc = XDocument.Load(pathXml);
var transactions = doc.Descendants("Anzeige").Descendants("Kunde").Descendants("Konto").Descendants("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
}).ToList();
if (transactions != null)
return transactions.ToList();
else
return new List<Transaction>();
}
答案 0 :(得分:3)
使用元素转换为字符串而不是直接读取它的值。如果找不到元素,则会有null
字符串而不是异常:
var doc = XDocument.Load(pathXml);
var comptes = doc.Descendants("Anzeige")
.Descendants("Kunde")
.Descendants("Konto")
.Select(k => new Compte {
NumCompte = (string)k.Element("KtoNr"),
typeCompte = (string)k.Element("KontoArt"),
Trans = getXmlTransactions(k)
}).ToList();
如果在找不到元素时想要空字符串而不是null
,可以使用null-coalescing运算符
NumCompte = (string)p.Element("KtoNr") ?? ""
使用相同的技术来解析可能不存在的节点。而且我很确定它的getXmlTransactions(pathXml)
方法会引发异常。
更新:获取事务时不要加载整个xml文档。你怎么知道要读取的Konto元素交易。通过Konto元素并获得其交易:
public static List<Transaction> getXmlTransactions(XElement konto)
{
return konto.Elements("Transaction")
.Select(t => new Transaction {
TransID = (string)t.Element("idTrans"),
TypeTransaction = (string)t.Element("type")
}).ToList();
}
注意:您在<idTrans>
(而不是TransID
)中有<type>
(而不是TransArt
)和<Transaction>
(而不是Transaktion
)元素!此外,xml中没有KtoNr
和KontoArt
个元素。仔细阅读元素名称。而不是寻找所有后代,最好搜索直接的孩子:
doc.Root.Elements("Kunde").Elements("Konto") ...