2016-08-16 5 views
1

Я использовал API погоды, чтобы возвращать значения температуры в формате XML и записывать их в текстовый файл. Следующий шаг - чтение значений из файла XML для использования в моей программе. Это формат, в котором находятся значения;Чтение определенных значений из XML в C#

<temperature value="21.37" min="18.89" max="22.78" unit="metric"> 
</temperature> 
<humidity value="68" unit="%"> 
</humidity> 
<pressure value="1019" unit="hPa"> 
</pressure> 

Я хотел бы получить доступ к значению температуры, но я не уверен, как сделать это путем чтения из текстового файла, особенно если учесть, что текстовый файл намного больше, чем то, что мне нужно. Каким будет наиболее эффективный способ доступа к значениям, которые я хочу?

EDIT:

<current> 
    <city id="" name=""> 
    <coord lon="-0.45" lat="52.19"> 
    </coord> 
    <country>GB</country> 
    <sun rise="2016-08-16T04:48:13" set="2016-08-16T19:22:26"> 
    </sun> 
    </city> 
    <temperature value="22.06" min="19.44" max="23.89" unit="metric"> 
    </temperature> 
    <humidity value="67" unit="%"> 
    </humidity> 
    <pressure value="1019" unit="hPa"> 
    </pressure> 
    <wind> 
    <speed value="2.57" name="Light breeze"> 
    </speed> 
    <gusts value="6.17"> 
    </gusts> 
    <direction value="73" code="ENE" name="East-northeast"> 
    </direction> 
    </wind> 
    <clouds value="24" name="few clouds"> 
    </clouds> 
    <visibility> 
    </visibility> 
    <precipitation mode="no"> 
    </precipitation> 
    <weather number="801" value="few clouds" icon="02d"> 
    </weather> 
    <lastupdate value="2016-08-16T10:44:02"> 
    </lastupdate> 
</current> 

ответ

1

Одним из способов может быть:

var result = XDocument.Load("data.xml").Root 
         .Element(/*.... the rest of the hierarchy.. */) 
         .Element("temperature") 
         .Attribute("value").Value; 

Если вы не хотите указывать полный путь к элементу вы можете:

var result = XDocument.Load("data.xml").Root 
         .Descendants("temperature") 
         .Select(element => element.Attribute("value").Value).FirstOrDefault(); 
+0

Я получаю сообщение об ошибке с помощью этого метода: 'Дополнительная информация: данные на корневом уровне недействительны. Строка 1, позиция 1'. Я обновил свой вопрос с полным XML-файлом. – CBreeze

+0

@CBreeze - теперь я выполнил оба раздела кода на вашем заданном xml, и это нормально. Вы уверены, что xml в вашем выходном каталоге тот же? –

0
var xml = XElement.Parse("<root><temperature value=\"21.37\" min=\"18.89\" max=\"22.78\" unit=\"metric\"></temperature><humidity value=\"68\" unit=\"%\"></humidity><pressure value=\"1019\" unit=\"hPa\"></pressure></root>"); // this line is just to test. You can use what you are getting from API Call. 

var result = xml.Elements("temperature") 
          .Select(c => c.Attribute("value").Value); // the attribute value 
0

Usse xml linq

using System; 
using System.Globalization; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication7 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      var results = doc.Descendants("current").Select(x => new { 
       temperature = x.Elements("temperature").Select(y => new { 
        value = (decimal)y.Attribute("value"), 
        min = (decimal)y.Attribute("min"), 
        max = (decimal)y.Attribute("max"), 
        unit = (string)y.Attribute("unit") 
       }).FirstOrDefault(), 
       humidity = x.Elements("humidity").Select(y => new 
       { 
        value = (decimal)y.Attribute("value"), 
        unit = (string)y.Attribute("unit") 
       }).FirstOrDefault(), 
       pressure = x.Elements("pressure").Select(y => new 
       { 
        value = (decimal)y.Attribute("value"), 
        unit = (string)y.Attribute("unit") 
       }).FirstOrDefault() 


      }).FirstOrDefault(); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^