以下是我的天气应用程序将从互联网上下载的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>
答案 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