我无法从xml获得价值

时间:2013-04-05 12:32:08

标签: c# xml linq-to-xml

我有xml

<?xml version="1.0" encoding="UTF-8"?>
<info lang="ru" xmlns:x="http://www.yandex.ru/xscript">
    <region id="213" lon="37.617671" lat="55.755768" zoom="10">
        <title>Москва</title>
    </region>
    <traffic lon="37.617671" lat="55.755768" zoom="10"region="213">
        <length>489164.0</length>
        <level>6</level>
        <icon>yellow</icon>
        <timestamp>1365162401</timestamp>
        <time>15:46</time>
        <url>http://maps.yandex.ru/moscow_traffic</url>
        <title>Москва</title>
    </traffic>
</info>

我需要从“级别”获得价值

public void GetText(string filename)
    {  
        try
        {
            XDocument xDocument = LoadPage(filename);
            if (xDocument.Root == null) return;
            XElement elem = xDocument.Root.Element("info");
            if (elem != null)
                foreach (var el in elem.Elements("traffic"))
                {
                    Name = el.Element("level").Value;
                };
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }

这段代码适用于另一个xml。它找不到“info”,而elem = null。这段代码出了什么问题。或者我怎样才能以其他方式获得此值。谢谢!

1 个答案:

答案 0 :(得分:3)

这是问题所在:

XElement elem = xDocument.Root.Element("info");

在您提供给我们的XML中,xDocument.Root info元素。只需将其更改为:

XElement elem = xDocument.Element("info");

这将检查根元素 info

另一种选择是:

foreach (var el in xDocument.Elements("info")
                            .Elements("traffic"))

这样,如果Elements(info)返回一个空集合,你就不会进入循环体。

编辑:如果您需要它来处理有时 info是根元素的文档,有时它不是,您可能想要使用:

foreach (var el in xDocument.Descendants("info")
                            .Take(1)
                            .Elements("traffic"))

(虽然在那种情况下很奇怪。)