WP7 Linq to XML以按名称获取XElement的子元素

时间:2010-12-11 01:01:23

标签: c# .net silverlight windows-phone-7 linq-to-xml

我知道这是一个有点简单的问题,但即使在查看SO和LINQ to XML教程的答案之后,我也无法使其工作。我正在使用Windows Phone 7,但我认为这不应该有所作为。

我的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填充。我读过的教程都使用这种符号来按名称选择一个元素,但它对我不起作用。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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);
}