Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XmLReader将XML数据解析为C#_C#_Xml - Fatal编程技术网

使用XmLReader将XML数据解析为C#

使用XmLReader将XML数据解析为C#,c#,xml,C#,Xml,我正在做我的学校项目,关于使用天气数据,我只需要温度。 以下是一个例子: <time day="2014-05-01"> <symbol number="500" name="light rain" var="10d"/> <precipitation value="0.5" type="rain"/> <temperature day="7.6" min="6.8" max="7.6" night="6.8" eve="7.6" mo

我正在做我的学校项目,关于使用天气数据,我只需要温度。 以下是一个例子:

<time day="2014-05-01">
   <symbol number="500" name="light rain" var="10d"/>
   <precipitation value="0.5" type="rain"/>
   <temperature day="7.6" min="6.8" max="7.6" night="6.8" eve="7.6" morn="7.6"/>
   <clouds value="overcast clouds" all="88" unit="%"/>
</time>
然后,这里有一个问题

while (myXmlReader.Read())
它说{“根级别的数据无效。第1行,位置1。”}。当我不使用变量
link
并直接添加链接时,不会发生这种情况:

WebRequest myRequest = WebRequest.Create(@"http://api.openweathermap.org/data/2.5/forecast/daily?q=London&mode=xml&units=metric&cnt=17");
非常感谢您的帮助

关于变量
city

<form>
City: <select name="city">
    <option value="Helsinki">Helsinki</option>
    <option value="Lahti">Lahti</option>
    <option value="Tampere">Tampere</option>
    <option value="Oulu">Oulu</option>
    <option value="Rovaniemi">Rovaniemi</option>
    <option value="Espoo">Espoo</option>
    <option value="Vantaa">Vantaa</option>
</select> <br/>
<input type="submit" value="Submit to see the result"/>
</form>
<%string city = Request["city"]%>

城市:
赫尔辛基
拉赫蒂
坦佩雷
奥鲁
罗瓦涅米
艾斯堡
万塔


您在处理元素时遗漏了这些元素,一旦您找到
时间
元素,您就不能
温度
元素上。您必须继续阅读xml文档,直到找到该元素为止。我结合了几个if来压缩代码,但这确实有效:

var city="London";
var url = String.Format(
            "http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&mode=xml&units=metric&cnt=17"
            , city);

string temperature = String.Empty;
string  day ="2014-05-02";

using(var wc = new WebClient())
{
    using(var stream = wc.OpenRead(url))
    {
        using(var myXmlReader = new XmlTextReader(stream))
        {
            while (myXmlReader.Read())
            {
                 // <time day="2014-05-01">
                if (myXmlReader.NodeType == XmlNodeType.Element 
                    && myXmlReader.Name == "time"
                    && myXmlReader.HasAttributes
                    && myXmlReader.GetAttribute("day") == day)
                {
                    // find the inner elements    
                    while (myXmlReader.Read())
                    {
                        // skip <symbol> <precipitation> <windDirection>  
                        //  and <windSpeed>
                        if (myXmlReader.NodeType == XmlNodeType.Element 
                            && myXmlReader.Name == "temperature"
                            && myXmlReader.HasAttributes
                            && myXmlReader.GetAttribute("day") != null)
                        {
                            // <temperature day="7.83" min="6.76" max="7.83" 
                            //   night="6.76" eve="7.83" morn="7.83"/>
                            temperature = myXmlReader.GetAttribute("day"); 
                            break;  // stop reading!
                        }
                    }
                }
            }
        }
    }
}

您可能应该查看XDocument。使用streamreader加载xml。查看本文,特别是使用XmlReader读取数据的部分。你也可以使用XMLDocument类。如果你进行调试,
city
的值是多少?例如,如果你愿意,它可以是伦敦。所有这些嵌套的if语句让我痛苦地哭泣。这是非常糟糕的代码,尤其是因为您重复了许多语句。永远不要,每个人都这样做。谢谢你的帮助。但是它也表示{“根级别的数据无效。第1行,位置1。”}位于
而(myXmlReader.Read())
。我不知道为什么?这可能是因为您的城市变量为空或不正确。如果调试到创建url的位置,则可以检查完整url的值。或者,您可以使用查看发送了哪些请求。或者您可以添加一个跟踪;然后访问/trace.axd,如中所述。您的bug不在显示的代码中。我正在做一个web应用程序,所以城市将由用户决定(一些城市的选择表格可用)。因此,变量
city
在加载web之前不会分配任何值。您最好问一个关于city变量为空的新问题。确保您的问题显示了aspx标记和代码隐藏。您应该首先自己调试代码:
<form>
City: <select name="city">
    <option value="Helsinki">Helsinki</option>
    <option value="Lahti">Lahti</option>
    <option value="Tampere">Tampere</option>
    <option value="Oulu">Oulu</option>
    <option value="Rovaniemi">Rovaniemi</option>
    <option value="Espoo">Espoo</option>
    <option value="Vantaa">Vantaa</option>
</select> <br/>
<input type="submit" value="Submit to see the result"/>
</form>
<%string city = Request["city"]%>
var city="London";
var url = String.Format(
            "http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&mode=xml&units=metric&cnt=17"
            , city);

string temperature = String.Empty;
string  day ="2014-05-02";

using(var wc = new WebClient())
{
    using(var stream = wc.OpenRead(url))
    {
        using(var myXmlReader = new XmlTextReader(stream))
        {
            while (myXmlReader.Read())
            {
                 // <time day="2014-05-01">
                if (myXmlReader.NodeType == XmlNodeType.Element 
                    && myXmlReader.Name == "time"
                    && myXmlReader.HasAttributes
                    && myXmlReader.GetAttribute("day") == day)
                {
                    // find the inner elements    
                    while (myXmlReader.Read())
                    {
                        // skip <symbol> <precipitation> <windDirection>  
                        //  and <windSpeed>
                        if (myXmlReader.NodeType == XmlNodeType.Element 
                            && myXmlReader.Name == "temperature"
                            && myXmlReader.HasAttributes
                            && myXmlReader.GetAttribute("day") != null)
                        {
                            // <temperature day="7.83" min="6.76" max="7.83" 
                            //   night="6.76" eve="7.83" morn="7.83"/>
                            temperature = myXmlReader.GetAttribute("day"); 
                            break;  // stop reading!
                        }
                    }
                }
            }
        }
    }
}
string  WheaterFromXDocument()
{
    var city="London";
    var url = String.Format(
                "http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&mode=xml&units=metric&cnt=17"
                , city);

    string temperature = String.Empty;
    string  day ="2014-05-02";

    using(var wc = new WebClient())
    {
        using(var stream = wc.OpenRead(url))
        {
            var dayAttr  = (from  time in XDocument.Load(stream).Descendants("time")
                        where (string) time.Attribute("day") == day
                        from tempElem in time.Elements("temperature")
                        select tempElem.Attribute("day"))
                        .SingleOrDefault();
            if (dayAttr!=null)
            {
                temperature = dayAttr.Value;
            }
        }
    }

    return temperature;
}