2016-12-30 3 views
1

を解析中に、私は取り扱いノード私はXDocument解析を使用していますので、XMLからアカウントIDの値が「GT」を取得したい

<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> 

以下のように見えるAPIのXMLレスポンスを持って存在し、以下のコードを使用すると、

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として「文字列」を使用しないでください文字列がNULL値を好きではない2)ドン。 nullのときにエラーを返す値を使用する代わりに、これを試してみてください:string accountID = new_doc.Descendants(ns + "field")ここで(field => field.Attribute( "name")!= null).Select(x =>(文字列)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; 
関連する問題