2011-09-21 70 views
1

我收到此XML從外部源:爲什麼這個LINQ to XML不起作用?

<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"> 
    <response> 
    <result code="1300"> 
     <msg>Command completed successfully; no messages</msg> 
    </result> 
    <trID> 
     <clTRID>TEST-12345</clTRID> 
     <svTRID>IRNIC_2011-09-21T13:44:25+04:30_f1u</svTRID> 
    </trID> 
    </response> 
</epp> 

我要提取的代碼的屬性結果元件。我用這個代碼:

XDocument doc = XDocument.Parse(response); 
XNamespace ns = "urn:ietf:params:xml:ns:epp-1.0"; 
string value = doc.Descendants(ns + "result").First().Attribute("code").Value; 

然而,拋出空值例外,因爲doc.Descendants(ns + "result")爲空。

這裏有什麼問題?

+1

'後代( 「甕:IETF:PARAMS:XML:NS:EPP-1.0result」)的建議'?是對的嗎? – bzlm

+1

對我來說看起來很好 - 你有沒有用調試器檢查'doc'來驗證它是上面包含的XML文檔? – ColinE

+0

@ColinE,是的,這是有效的,一切都如我在這裏發佈的。 –

回答

1

沒有再現。你的代碼基本上可以。

所以:調試。打破聲明並檢查事情。

  • 是你的doc加載好嗎?
  • 剛剛doc.Descendants(ns + "result").First()提供什麼?
3

然而,拋出空值例外,因爲doc.Descendants(NS + 「結果」)爲空

我不希望doc.Descendants曾經回報null - 它可能會返回一個空序列,但這不會是一個「空值異常」。同樣,First() - 它要麼返回東西,要麼拋出一個異常(雖然「something」可以是null,但我不認爲Descendants會產生null s)。所以那個留下.Attribute("code").Value。現在是;如果屬性不存在,則返回null。如果你很高興在這些情況下獲得null,我建議:

string value = (string)doc.Descendants(ns + "result").First().Attribute("code"); 

轉換操作符處理空(不存在)的屬性。

1

檢查response變量,因爲我從xml文件中加載了xml,並且您的代碼運行良好。

在測試的情況下,您可以將響應保存在一個xml文件中並從那裏加載。使用XDocument.Load("a.xml")加載xml文件。

1

也對此進行了測試。最簡單的測試方法是下載LinqPad,創建新的查詢,然後從語言下拉菜單中選擇「C#語句」。點擊運行,應該使用提供的代碼。我還要檢查響應變量由 「Rased點網」

string xml = 
@"<epp xmlns=""urn:ietf:params:xml:ns:epp-1.0""> 
    <response> 
    <result code=""1300""> 
     <msg>Command completed successfully; no messages</msg> 
    </result> 
    <trID> 
     <clTRID>TEST-12345</clTRID> 
     <svTRID>IRNIC_2011-09-21T13:44:25+04:30_f1u</svTRID> 
    </trID> 
    </response> 
</epp>"; 

XDocument doc = XDocument.Parse(xml); 
Console.WriteLine(doc.ToString()); 
XNamespace ns = doc.Root.Name.Namespace; 
Console.WriteLine("Namespace: " + ns.ToString()); 
string value = doc.Descendants(ns + "result").First().Attribute("code").Value; 
Console.WriteLine(value);