0

私は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 です。このコードの何が問題なのですか。または、他の方法でこの値を取得するにはどうすればよいですか。ありがとう!

4

1 に答える 1

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"))

(そのような状況にあるのはかなり奇妙です。)

于 2013-04-05T12:40:03.893 に答える