C# 从 XML 中提取数据
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16491811/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C# extracting data from XML
提问by user1810659
I'm trying to read weather data from XML in a URL. The XML looks like this:
我正在尝试从 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>
I am interested in the forecast data in the XML. I want to get the time from and time to, then the weather data. For example the temperature is written like this in the XML:
我对 XML 中的预测数据感兴趣。我想获取时间和时间,然后是天气数据。例如温度在 XML 中是这样写的:
<temperature unit="celsius" value="9"/>
I want to extract the data with something like this:
我想用这样的东西提取数据:
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);
I created sample code that is able to read everything but I don't know how to extract just the data I need. The code I have now looks like this:
我创建了能够读取所有内容的示例代码,但我不知道如何仅提取我需要的数据。我现在的代码如下所示:
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;
}
}
Any ideas how I can extract just the weather data and the time?
有什么想法可以提取天气数据和时间吗?
采纳答案by arunlalam
Use LINQ to XML
使用 LINQ 到 XML
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;
}
I haven't populated everything. I hope you get the idea of how to use it.
我还没有填充所有内容。我希望你知道如何使用它。
回答by user1810659
This may help you access specific node values as you seem to be wanting. Hope it helps!
这可以帮助您访问特定的节点值,就像您想要的那样。希望能帮助到你!
回答by ILMTitan
Use the XElementfrom System.Xml.Linq
使用XElement从System.Xml.Linq
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);});

