私は以下のXMLを持っています。予測の下には多くの「時間」ノードがあります... 20歳を超えると、 私はLocationのデータとTimeの属性を返すことができましたが、私は降水量や雲に苦しんでいます。XMLをさまざまなレベルで解析する
<weatherdata>
<location>
<name>Tokyo</name>
<country>JP</country>
</location>
<forecast>
<time from="2017-08-19T12:00:00" to="2017-08-19T15:00:00">
<precipitation unit="3h" value="0.1925" type="rain"/>
<clouds value="overcast clouds" all="88" unit="%"/>
</time>
<time from="2017-08-19T15:00:00" to="2017-08-19T18:00:00">
<precipitation unit="3h" value="0.085000000000001" type="rain"/>
<clouds value="overcast clouds" all="92" unit="%"/>
</time>
<time from="2017-08-19T18:00:00" to="2017-08-19T21:00:00">
<precipitation unit="3h" value="0.7125" type="rain"/>
<clouds value="overcast clouds" all="88" unit="%"/>
</time>
</forecast>
</weatherdata>
私の問題(私が知っているもの)は、以下のコードでC#commentwhereとしてマークされています。
using (respStream = resp.GetResponseStream())
{
location = new WeatherData.Location.LocationData();
XmlDocument xml = Utility.retrieveXMLDocFromResponse(respStream, "/weatherdata");
location.country = xml.GetElementsByTagName("country")[0].InnerText;
location.name = xml.GetElementsByTagName("name")[0].InnerText;
forecastList = new List<WeatherData.Forecast.Time>();
XmlNodeList xnlNodes = xml.DocumentElement.SelectNodes("/weatherdata/forecast");
foreach (XmlNode xndNode in xnlNodes)
{
WeatherData.Forecast.Time time = new WeatherData.Forecast.Time();
time.from = xndNode["time"].GetAttribute("from");
time.to = xndNode["time"].GetAttribute("to");
// Here I am able to get data for clouds and preciptation, but the loop goes through all the 20 nodes. I just want to return the "preciptation" and "clouds" of the relevant "time" node.
XmlNodeList xnlTNodes = xml.DocumentElement.SelectNodes("/weatherdata/forecast/time");
foreach (XmlNode xmlTimeNode in xnlTNodes)
{
time.clouds = xmlTimeNode["clouds"].GetAttribute("value");
time.precipitation = xmlTimeNode["precipitation"].GetAttribute("type");
}
forecastList.Add(time);
}
}
WeatherDataクラスには、単にデータを格納するゲッター/セッターメソッドが含まれています。私の他の2つの参照メソッドは同じことを以下で行いますが、XmlNodeListともう1つはXMLドキュメントを返します。私は今のクラスへの参照を作成しないだけよう
彼らは静的です:
public static XmlNodeList retrieveXMLResponse(Stream stream, String baseNode)
{
StreamReader reader = null;
XmlElement xelRoot = null;
XmlNodeList xnlNodes = null;
try
{
reader = new StreamReader(stream, Encoding.UTF8);
string responseString = reader.ReadToEnd();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(responseString);
xelRoot = xmlDoc.DocumentElement;
xnlNodes = xelRoot.SelectNodes(baseNode);
}
finally
{
reader.Close();
}
return xnlNodes;
}
public static XmlDocument retrieveXMLDocFromResponse(Stream stream, String baseNode)
{
StreamReader reader = null;
XmlDocument xmlDoc = null;
try
{
reader = new StreamReader(stream, Encoding.UTF8);
string responseString = reader.ReadToEnd();
xmlDoc = new XmlDocument();
xmlDoc.LoadXml(responseString);
}
finally
{
reader.Close();
}
return xmlDoc;
}
あなたのコードで何が動作しませんか?すべての時間ノードを選択し、その時間ノードにアクセスすることは大丈夫です。他に何をしたいですか?単に10行目の予測ノードを選択しないでください。 –