2014-01-23 82 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