2014-01-23 32 views
0

我从XML文件填充列表。有些节点可能不存在,并且这会导致异常,因为它返回null。代码如下:异常C#空列表

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文件的

为例:getXmlTransaction的

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

代码:

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

很可能你在'getXmlTransactions(pathXml)'调用中有例外。当我的答案中不存在节点时,我展示了解析xml的几个提示,但是您需要显示方法定义(以及您试图解析的xml) –

+0

getXmlTransaction(pathxml)的内容与getXmlComptes相同,我称它为Compte包含交易清单 – user1503496

+0

我认为它不一样。还有它不好重新加载整个XML来获取某些元素的子节点 –

回答

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") ... 
+0

例如'.Descendants(“Kunde”)'不存在时,威尔还不会抛出? – CodeCaster

+1

@CodeCaster否,如果找不到'Kunde','Descendants'将返回空序列 –

+1

然后我想知道_where_ OP有他的'NullReferenceException'。 – CodeCaster