提取从Internet下载的XML文档的特定区域

时间:2013-12-23 23:57:40

标签: c# xml windows-phone-8

以下是我的天气应用程序将从互联网上下载的XML文件示例。 XML文档包含天气数据。

在没有围绕它的所有其他XML垃圾的情况下提取温度值的最简单方法是什么?

我希望能够将此方法用于XML文件的任何其他区域,例如提取日出/日落数据。

如果需要,我可以将其转换为字符串。

<current>
  <city id="6295630" name="Earth">
    <coord lon="0" lat="0"/>
    <country/>
    <sun rise="2013-12-23T05:55:41" set="2013-12-23T18:03:08"/>
  </city>
  <temperature value="289.58" min="285.37" max="294.26" unit="kelvin"/>
  <humidity value="99" unit="%"/>
  <pressure value="1014" unit="hPa"/>
  <wind>
    <speed value="3.11" name="Light breeze"/>
    <direction value="195.004" code="SSW" name="South-southwest"/>
  </wind>
  <clouds value="80" name="broken clouds"/>
  <precipitation value="1.53" mode="rain" unit="3h"/>
  <weather number="500" value="light rain" icon="10n"/>
  <lastupdate value="2013-12-23T23:15:11"/>
</current>

3 个答案:

答案 0 :(得分:2)

XPath

/current/temperature

将仅选择<temperature>节点(或节点,如果有多个节点)。

要获得当前温度(我假设是value属性的值,您可以说:

/current/temperature/@value

将获取属于value节点的所有名为<temperature>的属性。

如果将XML融入XmlDocument,则可以使用Xpath从文档中选择所需的元素。它可以像

一样简单
string textXmlDocument = LoadXmlAsString() ;

// slurp the xml into an XmlDocument
XmlDocument xml = new XmlDocument() ;
xml.LoadXml( textXmlDocument) ;

// extract the temperature node
XmlNode currentTemp = xml.SelectSingleNode( @"/current/temperature") ;

// parse the value of its value attribute as a double.
string  s           = currentTemp.Attributes["value"].Value ;
double  temperature ;
bool parsed = double.TryParse(s) ;

需要注意的是,XML文档非常简单,构建一个类并标记它及其属性非常容易,这样您就可以使用CLR基于属性的XML序列化将xml反序列化到类中。 。像这样的未完成和未经测试的例子:

[XmlRoot("current")]
public class WeatherReading
{

  [XmlElement("city")]
  public WeatherReadingCity City { get ; set ; }

  [XmlElement("temperature")]
  public WeatherReadingTemperature Temperature { get ; set ; }

}

public class WeatherReadingTemperature
{

  [XmlAttribute("value")]
  public double Current { get ; set ; }

  [XmlAttribute("min")]
  public double Minimum { get ; set ; }

  [XmlAttribute("max")]
  public double Maximum { get ; set ; }

  [XmlAttribute("unit")]
  public TemperatureScale Scale { get ; set ; }

}

public enum TemperatureScale
{
  Unknown     = 0 ,
  Fahrenheith = 1 ,
  Centigrade  = 2 ,
  Celsius     = 2 ,
  Kelvin      = 3 ,
}

public class WeatherReadingCity
{

  [XmlAttribute("id")]
  public int Id { get ; set ; }

  [XmlAttribute("name")]
  public string Name { get ; set ; }

  [XmlElement("coord")]
  public WeatherReadingPosition Position { get ; set ; }

}

public class WeatherReadingPosition
{

  [XmlAttribute("lat")]
  public double Latitude  { get ; set ; }

  [XmlAttribute("long")]
  public double Longitude { get ; set ; }

}

答案 1 :(得分:0)

使用XDocument可能是最简单的,请参阅http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument(v=vs.110).aspx。这基本上是LINQ for XML。

 XDocument doc = // load your XML into the document

 var tempValue = doc.Descendents("temperature").Attribute("value").Value;
 var tempUnit = doc.Descendents("temperature").Attribute("unit").Value;

答案 2 :(得分:0)

加载到XmlDocument中,然后提取值..

var doc = new XmlDocument();
doc.LoadXml(yourXmlString);

XmlNode tempNode = doc.SelectSingleNode(@"current\temperature");
XmlAttribute attr = tempNode.Attributes["value"];

// attr.Value = now holds the string 289.58