2016-12-30 66 views
1

存在我有一個看起來API的XML響應像下面處理節點,同時解析

<lab:lab uri="https://bh03.org/api/lb/3" xmlns:udf="http://ge.com/ri/userdefined" xmlns:ri="http://ge.com/ri" xmlns:lab="http://ge.com/ri/lab"> 
    <name>GTech</name> 
    <udf:field type="String" name="Account ID">gt</udf:field> 
</lab:lab> 

我想獲得帳戶ID的價值「GT」從XML,所以我使用的XDocument解析和使用下面的代碼

XDocument new_doc = XDocument.Parse(responseString_LabURL); 
XNamespace ns = "http://ge.com/ri/userdefined"; 
string accountID = new_doc.Descendants(ns + "field").FirstOrDefault(field => field.Attribute("name").Value.Equals("Account ID")).Value; 

但有時會出現在XML沒有<udf:field type="String" name="Account ID">gt</udf:field>和可能看起來像下面

<lab:lab uri="https://bh03.org/api/v2/labs/1302" xmlns:udf="http://ge.com/ri/userdefined" xmlns:ri="http://ge.com/ri" xmlns:lab="http://ge.com/ri/lab"> 
    <name>lsd</name> 
</lab:lab> 

如何處理沒有領域。

+0

兩點建議1)不要使用「字符串」類型使用VAR串不喜歡空值2)唐。 't使用值爲null時給出錯誤,而是嘗試使用:string accountID = new_doc.Descendants(ns +「field」)。其中(field => field.Attribute(「name」)!= null).Select(x =>(string)field.Attribute(「name」))。FirstOrDefault(); – jdweng

回答

1

如果元素<udf:field></udf:field>存在,我會開始測試。就像這樣:

string accountID; 
XDocument new_doc = XDocument.Parse(responseString_LabURL); 
XNamespace ns = "http://ge.com/ri/userdefined"; 

if (new_doc.Descendants(ns + "field").Any()) 
{ 
    accountID = new_doc.Descendants(ns + "field").FirstOrDefault(field => field.Attribute("name").Value.Equals("Account ID")).Value; 
} 
else 
{ 
    accountID = null; // or whatever 
} 

簡寫上面的代碼是:

accountID = new_doc.Descendants(ns + "field").Any() ? new_doc.Descendants(ns + "field").FirstOrDefault(field => field.Attribute("name").Value.Equals("Account ID")).Value : null;