2010-12-11 173 views
1

我知道這是一個比較容易的問題,但即使在查看SO和LINQ to XML教程的答案之後,我仍然無法使其工作。我正在使用Windows Phone 7,但我認爲這不應該有所作爲。WP7 Linq to XML按名稱獲取XElement的子元素

我有XML,看起來像這樣:

<response xmlns="http://anamespace.com/stuff/"> 
    <error code="ERROR_CODE_1">You have a type 1 error</error> 
</response> 

我有上面的XML加載到的XElement。我想獲得「錯誤」節點。 This question說你需要處理命名空間。我已經嘗試了使用和不使用名稱空間的查詢,並且它無法以任何方式工作。

查詢命名空間:

private object ParseElement(XElement responseElement) 
{ 
    XNamespace ns = "http://anamespace.com/stuff/"; 
    IEnumerable<XElement> errorNodes = from e in responseElement.Elements(ns + "error") select e; 
} 

查詢無命名空間:

private object ParseElement(XElement responseElement) 
{ 
    IEnumerable<XElement> errorNodes = from e in responseElement.Elements("error") select e; 
} 

的errorNodes變量永遠不會與XElements填充。我讀過的教程都使用這種符號來按名稱選擇元素,但它不適合我。

回答

1

此代碼作品在我的機器 ™:

XElement response = XElement.Parse(
@"<response xmlns=""http://anamespace.com/stuff/""> 
    <error code=""ERROR_CODE_1"">You have a type 1 error</error> 
</response>"); 

XNamespace ns = "http://anamespace.com/stuff/"; 

XElement error = response.Element(ns + "error"); 

string code = (string)error.Attribute("code"); 
string message = (string)error; 

Console.WriteLine(code); 
Console.WriteLine(message); 

我的機器上運行.NET正規4雖然,所以也許你可以運行該代碼,並檢查它是否適合WP7。

+0

它的工作原理!非常感謝 – CACuzcatlan 2010-12-11 01:33:44

0

您正在閱讀整個文檔而不是error元素的任何機會?

如果您使用Descendants而不是Elements,它會起作用嗎?

[TestMethod] 
public void CanGetErrorElements() 
{ 
    string xml = @" 
<response xmlns=""http://anamespace.com/stuff""> 
<error code=""ERROR_CODE_1"">You have a type 1 error</error> 
</response>"; 
    XDocument doc = XDocument.Parse(xml); 
    XNamespace ns = "http://anamespace.com/stuff"; 
    var errorNodes = from e in doc.Descendants(ns + "error") 
        select e; 
    Assert.IsTrue(errorNodes.Count() > 0); 
}