2016-12-30 70 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;