web-dev-qa-db-ja.com

XMLからデータを抽出するC#

URLのXMLから気象データを読み取ろうとしています。 XMLは次のようになります。

<weatherdata>
<location>...</location>
<credit>...</credit>
<links>...</links>
<meta>...</meta>
<Sun rise="2013-05-11T04:49:22" set="2013-05-11T21:39:03"/>
<forecast>
<text>...</text>
<tabular>
<time from="2013-05-11T01:00:00" to="2013-05-11T06:00:00" period="0">
<!--
 Valid from 2013-05-11T01:00:00 to 2013-05-11T06:00:00 
-->
<symbol number="2" name="Fair" var="mf/02n.03"/>
<precipitation value="0" minvalue="0" maxvalue="0.1"/>
<!--  Valid at 2013-05-11T01:00:00  -->
<windDirection deg="173.8" code="S" name="South"/>
<windSpeed mps="4.2" name="Gentle breeze"/>
<temperature unit="celsius" value="9"/>
<pressure unit="hPa" value="1004.2"/>
</time>
</tabular>
</forecast>
<observations>...</observations>
</weatherdata>

XMLの予測データに興味があります。からの時間とからの時間、そして天気データを取得したいと思います。たとえば、温度はXMLで次のように記述されます。

<temperature unit="celsius" value="9"/>

次のようなデータを抽出したいと思います。

 string fromTime = time from(the attribute in the xml);
                     string fromTime =time to(the attribute in the xml);
                    string name = temperature(the attribute in the xml);
                    string unit =unit(the attribute in the xml);
                    int value = value(the attribute in the xml);

すべてを読み取ることができるサンプルコードを作成しましたが、必要なデータだけを抽出する方法がわかりません。私が今持っているコードは次のようになります:

        String URLString = "http://www.yr.no/place/Norway/Oslo/Oslo/Oslo/forecast.xml";
        XmlTextReader reader = new XmlTextReader(URLString);

        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element: // The node is an element.
                    Console.Write("" + reader.Name);

                    while (reader.MoveToNextAttribute()) // Read the attributes.
                        Console.Write(" " + reader.Name + "='" + reader.Value + "'");
                    Console.Write("\n");
                    Console.WriteLine("------------------------------");
                    break;
                case XmlNodeType.Text: //Display the text in each element.
                    Console.WriteLine(reader.Value);
                    break;
                case XmlNodeType.EndElement: //Display the end of the element.
                    Console.Write("</" + reader.Name);
                    Console.WriteLine(">");
                    break;

            }
        }

天気データと時刻だけを抽出する方法はありますか?

9
user1810659

LINQ toXMLを使用する

XDocument X = XDocument.Load("http://www.yr.no/place/Norway/Oslo/Oslo/Oslo/forecast.xml");

var forecast = X.Element("weatherdata").Element("forecast");
var location = forecast.Descendants("location").Attributes("name").FirstOrDefault().Value;
var tempData = forecast.Element("tabular").Elements("time");

//This is what you need
var data = tempData.Select(item=>
            new{
                from = Convert.ToDateTime(item.Attribute("from").Value),
                to = Convert.ToDateTime(item.Attribute("to").Value),
                temp = item.Element("temperature").Attribute("value").Value
            });


//Or you can do a foreach if you need to
foreach (var item in tempData)
{
        DateTime from = Convert.ToDateTime(item.Attribute("from").Value);
        var temp = item.Element("temperature").Attribute("value").Value;
}

私はすべてを投入していません。使い方を知っていただければ幸いです。

8
arunlalam

System.Xml.LinqからXElementを使用します

XElement all = XElement.Load(reader);
var values = all.Decentents("forecast").Select(fc => {
     XElement time = fc.Element("time");
     XElement temp = fc.Element("temperature");
     return new Tuple<string, string, string, string>(
                  time.Attribute("from").Value,
                  time.Attribute("to").Value,
                  temperature.Attribute("unit").Value,
                  temperature.Attribute("value").Value);});
4
ILMTitan

これは、必要に応じて特定のノード値にアクセスするのに役立つ場合があります。それが役に立てば幸い!

指定の取得Node値

2
user2048714