Как парсить xml файл на c#?

150
07 января 2020, 20:00

Как вытянуть данные узла температур из данного xml файла, который расположен по ссылке https://xml.meteoservice.ru/export/gismeteo/point/434.xml:

    <MMWEATHER>
<REPORT type="frc3">
<TOWN index="434" sname="%D0%A1%D0%B8%D0%BC%D1%84%D0%B5%D1%80%D0%BE%D0%BF%D0%BE%D0%BB%D1%8C" latitude="45" longitude="34">
   <FORECAST day="03" month="04" year="2019" hour="21" tod="3" predict="0" weekday="4">
<PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/>
<PRESSURE max="766" min="764"/>
<TEMPERATURE max="8" min="1"/>
<WIND min="1" max="4" direction="2"/>
<RELWET max="65" min="37"/>
<HEAT min="-1" max="-1"/>
   </FORECAST>
   <FORECAST day="04" month="04" year="2019" hour="03" tod="0" predict="0" weekday="5">
<PHENOMENA cloudiness="0" precipitation="10" rpower="0" spower="0"/>
<PRESSURE max="766" min="766"/>
<TEMPERATURE max="1" min="-1"/>
<WIND min="1" max="3" direction="3"/>
<RELWET max="77" min="65"/>
<HEAT min="-4" max="-4"/>
   </FORECAST>
   <FORECAST day="04" month="04" year="2019" hour="09" tod="1" predict="0" weekday="5">
<PHENOMENA cloudiness="0" precipitation="10" rpower="0" spower="0"/>
<PRESSURE max="766" min="766"/>
<TEMPERATURE max="8" min="-1"/>
<WIND min="3" max="5" direction="3"/>
<RELWET max="76" min="40"/>
<HEAT min="-4" max="-4"/>
  </FORECAST>
  <FORECAST day="04" month="04" year="2019" hour="15" tod="2" predict="0" weekday="5">
<PHENOMENA cloudiness="1" precipitation="10" rpower="0" spower="0"/>
<PRESSURE max="765" min="764"/>
<TEMPERATURE max="10" min="9"/>
<WIND min="1" max="4" direction="2"/>
<RELWET max="36" min="34"/>
<HEAT min="5" max="5"/>
 </FORECAST>
</TOWN>
</REPORT>
</MMWEATHER>

Я попытался написать следующий код на C#, но при запуске я не получил ничего, кроме пустой консоли:

static void Main(string[] args)
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("https://xml.meteoservice.ru/export/gismeteo/point/434.xml");
        XmlElement xRoot = xDoc.DocumentElement;
        foreach (XmlNode xnode in xRoot)
        {
            foreach (XmlNode childnode in xnode.ChildNodes)
            {
                foreach (XmlNode childnode1 in childnode.ChildNodes)
                {
                    if (childnode1.Name == "RELWET")
                    {
                        XmlNode attr = childnode1.Attributes.GetNamedItem("max");
                        XmlNode attr1 = childnode1.Attributes.GetNamedItem("min");
                        if (attr != null && attr1 != null)
                        {
                            Console.WriteLine(attr.Value);
                            Console.WriteLine(attr1.Value);
                        }
                    }
                }
                Console.WriteLine();
            }
        }
        Console.Read();
    }

То есть я пытался вытянуть значение аргументов min и max, но ничего не получилось

Answer 1

Если вам известно название тега, то можете использовать метод GetElementsByTagName класса XmlDocument:

foreach (XmlNode item in xDoc.GetElementsByTagName("TEMPERATURE"))
{
    XmlNode attr = item.Attributes.GetNamedItem("max");
    XmlNode attr1 = item.Attributes.GetNamedItem("min");
    if (attr != null && attr1 != null)
    {
        Console.WriteLine(attr.Value);
        Console.WriteLine(attr1.Value);
    }
}
Answer 2

Оказывается проблема была в том, что я запутался во всех этих узлах, и не добавил обход по последнему узлу, поэтому ничего не выводилось.

 static void Main(string[] args)
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("https://xml.meteoservice.ru/export/gismeteo/point/434.xml");
        XmlElement xRoot = xDoc.DocumentElement;
        foreach (XmlNode xnode in xRoot)
        {
            foreach (XmlNode childnode in xnode.ChildNodes)
            {
                foreach (XmlNode childnode1 in childnode.ChildNodes)
                {
                    foreach (XmlNode childnode2 in childnode1.ChildNodes)
                    {
                        if (childnode2.Name == "TEMPERATURE")
                        {
                            XmlNode attr = childnode2.Attributes.GetNamedItem("max");
                            XmlNode attr1 = childnode2.Attributes.GetNamedItem("min");
                            if (attr != null && attr1 != null)
                            {
                                Console.WriteLine(attr.Value);
                                Console.WriteLine(attr1.Value);
                            }
                        }
                              //Console.WriteLine(childnode2.Name);
                        //            XmlNodeList xmlNL = childnode1.ChildNodes;
                        //Console.WriteLine(xmlNL.Count);   
                    }
                }
                Console.WriteLine();
            }
        }
        Console.Read();
    }
READ ALSO
Элемент формы похожий на строку excel

Элемент формы похожий на строку excel

Подскажите пожалуйста, какой элемент формы (c# winforms vs2010 net40) может выполнять функции как на рисунке ниже, т

156
Останавливать ли таймер при выходе из функции или сборщик мусора о нём позаботится?

Останавливать ли таймер при выходе из функции или сборщик мусора о нём позаботится?

Я использую Stopwatch таймер для засекания времени выполнения участков кода в функциях моих проектовПо-хорошему, перед выходом из функции, в которой...

138
Переключатель Switch в диалоговом окне

Переключатель Switch в диалоговом окне

есть диалоговое окно с Switch и TextView, хочу при переключении Switch отображать или прятать TextViewНиже приведенный код не работает, пробовал на переключение...

130
Где хранить пароль

Где хранить пароль

Пишу приложение aspnet core MVC

117