2013-09-26 93 views
1

我正在使用以下查詢將XML轉換爲結構。如果一個元素不存在,我怎麼會適應它下面的查詢(ClntCde會一直存在,但有機會的標題將不存在)元素不存在時返回空白字符串

ClientTbl ClientData = clientNode.Select(x => new ClientTbl 
    {   
     ClientCode = x.Elements().Where(e => e.Name.LocalName == "ClntCde").FirstOrDefault().Value, 
     //Title = x.Elements().Where(e => e.Name.LocalName == "Title").ToString(), 
     //Title = x.Elements().Where(e => e.Name.LocalName == "Title").FirstOrDefault().Value, 
     //Title = x.Elements("Title").FirstOrDefault().Value,                
    } 
).First(); 

的XML:

<Client xmlns="http://www.website.co.za/namespace"> 
    <ClntCde>0000013</ClntCde> 
    <Surname>Account Holder Surname</Surname> 
    <Address> 
     <Addr1>.</Addr1> 
     <Addr2>.</Addr2> 
     <Addr3>.</Addr3> 
     <Addr4>.</Addr4> 
     <PostCde>2000</PostCde> 
    </Address> 
    <ClntAccTyp>A</ClntAccTyp> 
    <ElecInd>NO</ElecInd> 
    <Lang>ENG</Lang> 
</Client> 
+0

你應該申報而不是使用'LocalName'..That命名空間會降低所有的雜波從您的代碼 – Anirudha

回答

1
Title = (String)x.Elements() 
       .Where(e => e.Name.LocalName == "Title") 
       .Single(); 

OR

delcare namepace

XNamespace ns="http://www.website.co.za/namespace"; 

,並參考其

Title = (String)x.Element(ns+"Title") 
+1

這不返回值或空字符串 – Moeri

+0

@Moeri它會返回值,如果元素退出或將返回null – Anirudha

0

嘗試:

Title = x.Elements() 
.Where(e => e.Name.LocalName == "Title") 
.Select(e => e.Value) 
.FirstOrDefault() ?? string.Empty; 
0
var ns = clientNode.GetDefaultNamespace(); 
ClientTbl ClientData = clientNode.Select(x => new ClientTbl 
    {   
     ClientCode = (string)x.Element(ns + "ClntCde") ?? string.Empty, 
     Title = (string)x.Element(ns + "Title") ?? string.Empty, 
    } 
).First(); 

更新1:添加默認的命名空間

更新2:添加一個空字符串,如果元素不存在

3

您可以使用DefaultIfEmpty("")

ClientCode = x.Elements() 
    .Where(e => e.Name.LocalName == "ClntCde") 
    .Select(e => e.Value) 
    .DefaultIfEmpty("") 
    .First(), 
Title = x.Elements() 
    .Where(e => e.Name.LocalName == "Title") 
    .Select(e => e.Value) 
    .DefaultIfEmpty("") 
    .First(), 
// ... 

注意,...OrDefault是多餘的,如果你提供自己的默認值。可以安全地撥打FirstSingle(仍然可以拋出多個元素),因爲它永遠不會爲空。

0

使用此XML Library您可以直接引用的每個元素,並給一個默認值,如果它不存在像這樣:

ClientTbl ClientData = clientNode.Select(x => new ClientTbl 
    {   
     ClientCode = x.Get("ClntCde", "defaultCode"), 
     Title = x.Get("Title", "defaultTitle"), 
     Addr1 = x.Get("Address/Addr1", "addr1 default"), 
     // and/or 
     Address = x.GetElement("Address") // Creates the Address node if doesn't exist 
        .Select(a => new 
      { 
       Addr1 = a.Get("Addr1", "addr1 default"), 
       // etc 
      }) 
    }); 

默認是類型特異性的。如果您的代碼始終是數字,則可以使用數字默認值,並且將是該類型。 Get也處理命名空間。

的(在這種情況下)Get has the syntax

T Get<T>(string name, T defaultValue);