异常C#空列表

时间:2014-01-23 08:15:02

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

我正在填写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>();
}

1 个答案:

答案 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中没有KtoNrKontoArt个元素。仔细阅读元素名称。而不是寻找所有后代,最好搜索直接的孩子:

doc.Root.Elements("Kunde").Elements("Konto") ...