2010-12-11 118 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); 
}