2013-09-26 52 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);