C# XML有问题吗

C# XML有问题吗,c#,xml,windows-phone-8,nullreferenceexception,C#,Xml,Windows Phone 8,Nullreferenceexception,下面的代码旨在从internet上提取XML文件并在下面对其进行解析。但是,当我尝试从此XML文件提取值时,会导致异常(nullreferencexeption) 下面是代码,注意到错误发生的位置: 代码下面是我试图从中提取值的XML文件 //Create the forecast void makeforecast() { //Make Webclient Request WebClient client = new WebClient(); client.Downlo

下面的代码旨在从internet上提取XML文件并在下面对其进行解析。但是,当我尝试从此XML文件提取值时,会导致异常(nullreferencexeption)

下面是代码,注意到错误发生的位置:

代码下面是我试图从中提取值的XML文件

//Create the forecast
void makeforecast()
{
    //Make Webclient Request
    WebClient client = new WebClient();
    client.DownloadStringAsync(new Uri("http://api.wt360.com/data/forecast/daily-4day?key=ic1uji3s9zjnjgcd6hq64ny6alkoin9119vjrxc1wwngdzuihk&l=" + latitude + "," + longitude + "&fmt=xml"));
    client.DownloadStringCompleted += (s, n) =>
    {
        progress.Visibility = System.Windows.Visibility.Collapsed;
        ((Storyboard)this.Resources["trans"]).Begin();
        XDocument xDoc = XDocument.Parse(n.Result);

        //Current Conditions
        if (debug2.Text == "Temp")
        {
        }
        if (debug2.Text == "Sun")
        {
        }
        if (debug2.Text == "Rain")
        {
           THIS LINE CAUSES THE EXEPTION >> tempnow.Text = xDoc.Root.Element("forecast").Element("pop").Value;**
        }
    }
}
以及XML:

<data>
<status>success</status>
<location>
<city/>
<fullName>39.6N, 0.3W - 6miles SW of El Puerto, SP</fullName>
<localDate>2014-01-30T01:29:23</localDate>
<localEpoch>1391045363</localEpoch>
<locationID>GP202368</locationID>
</location>
<forecast>
<record>0</record>
<utcEpoch>1391040000</utcEpoch>
<utcDate>2014-01-30T00:00:00</utcDate>
<maxTempC>15.4</maxTempC>
<maxTempF>59.7</maxTempF>
<minTempC>5.2</minTempC>
<minTempF>41.3</minTempF>
<fcstDay>1</fcstDay>
<dayLength>10:07</dayLength>
<sunriseHHMMLocal>8:11am</sunriseHHMMLocal>
<sunsetHHMMLocal>6:18pm</sunsetHHMMLocal>
<nightLength/>
<moonriseHHMMLocal/>
<moonsetHHMMLocal/>
<moonphase/>
<moonillum/>
<moonicon/>
<pop>19</pop>
<uv_index>2</uv_index>
<gustC>30</gustC>
<gustF>19</gustF>
<heatindexC>-999.99</heatindexC>
<heatindexF>-999.99</heatindexF>
<icon>partly-cloudy-sm.png</icon>
<iconBase>partly-cloudy</iconBase>
<iconLg>partly-cloudy.png</iconLg>
<prcpC>0</prcpC>
<prcpF>0</prcpF>
<rh>33</rh>
<skyCover>8</skyCover>
<snowC>0</snowC>
<snowF>0</snowF>
<wdir>NW</wdir>
<windchillC>-999.99</windchillC>
<windchillF>-999.99</windchillF>
<wspdC>16</wspdC>
<wspdF>10</wspdF>
<wx>Mostly Sunny</wx>
</forecast>
<forecast>
<record>1</record>
<utcEpoch>1391126400</utcEpoch>
<utcDate>2014-01-31T00:00:00</utcDate>
<maxTempC>16</maxTempC>
<maxTempF>60.8</maxTempF>
<minTempC>5</minTempC>
<minTempF>40.9</minTempF>
<fcstDay>2</fcstDay>
<dayLength>10:09</dayLength>
<sunriseHHMMLocal>8:10am</sunriseHHMMLocal>
<sunsetHHMMLocal>6:19pm</sunsetHHMMLocal>
<nightLength/>
<moonriseHHMMLocal/>
<moonsetHHMMLocal/>
<moonphase/>
<moonillum/>
<moonicon/>
<pop>18</pop>
<uv_index>2</uv_index>
<gustC>30</gustC>
<gustF>19</gustF>
<heatindexC>-999.99</heatindexC>
<heatindexF>-999.99</heatindexF>
<icon>partly-cloudy-sm.png</icon>
<iconBase>partly-cloudy</iconBase>
<iconLg>partly-cloudy.png</iconLg>
<prcpC>0</prcpC>
<prcpF>0</prcpF>
<rh>46</rh>
<skyCover>28</skyCover>
<snowC>0</snowC>
<snowF>0</snowF>
<wdir>WNW</wdir>
<windchillC>-999.99</windchillC>
<windchillF>-999.99</windchillF>
<wspdC>13</wspdC>
<wspdF>8</wspdF>
<wx>Mostly Sunny</wx>
</forecast>
<forecast>
<record>2</record>
<utcEpoch>1391212800</utcEpoch>
<utcDate>2014-02-01T00:00:00</utcDate>
<maxTempC>18.1</maxTempC>
<maxTempF>64.5</maxTempF>
<minTempC>6.4</minTempC>
<minTempF>43.5</minTempF>
<fcstDay>3</fcstDay>
<dayLength>10:12</dayLength>
<sunriseHHMMLocal>8:09am</sunriseHHMMLocal>
<sunsetHHMMLocal>6:21pm</sunsetHHMMLocal>
<nightLength/>
<moonriseHHMMLocal/>
<moonsetHHMMLocal/>
<moonphase/>
<moonillum/>
<moonicon/>
<pop>46</pop>
<uv_index>2</uv_index>
<gustC>49</gustC>
<gustF>31</gustF>
<heatindexC>-999.99</heatindexC>
<heatindexF>-999.99</heatindexF>
<icon>light-rain-shower-sm.png</icon>
<iconBase>light-rain-shower</iconBase>
<iconLg>light-rain-shower.png</iconLg>
<prcpC>0.2</prcpC>
<prcpF>0.09</prcpF>
<rh>35</rh>
<skyCover>27</skyCover>
<snowC>0</snowC>
<snowF>0</snowF>
<wdir>WNW</wdir>
<windchillC>-999.99</windchillC>
<windchillF>-999.99</windchillF>
<wspdC>22</wspdC>
<wspdF>14</wspdF>
<wx>Light Rain Showers</wx>
</forecast>
<forecast>
<record>3</record>
<utcEpoch>1391299200</utcEpoch>
<utcDate>2014-02-02T00:00:00</utcDate>
<maxTempC>15.9</maxTempC>
<maxTempF>60.7</maxTempF>
<minTempC>4.2</minTempC>
<minTempF>39.6</minTempF>
<fcstDay>4</fcstDay>
<dayLength>10:14</dayLength>
<sunriseHHMMLocal>8:08am</sunriseHHMMLocal>
<sunsetHHMMLocal>6:22pm</sunsetHHMMLocal>
<nightLength/>
<moonriseHHMMLocal/>
<moonsetHHMMLocal/>
<moonphase/>
<moonillum/>
<moonicon/>
<pop>12</pop>
<uv_index>2</uv_index>
<gustC>41</gustC>
<gustF>26</gustF>
<heatindexC>-999.99</heatindexC>
<heatindexF>-999.99</heatindexF>
<icon>sunny-sm.png</icon>
<iconBase>sunny</iconBase>
<iconLg>sunny.png</iconLg>
<prcpC>0</prcpC>
<prcpF>0</prcpF>
<rh>34</rh>
<skyCover>0</skyCover>
<snowC>0</snowC>
<snowF>0</snowF>
<wdir>WNW</wdir>
<windchillC>-999.99</windchillC>
<windchillF>-999.99</windchillF>
<wspdC>19</wspdC>
<wspdF>12</wspdF>
<wx>Sunny</wx>
</forecast>
</data>

成功
南纬39.6度,西经0.3度-波多黎各西南6英里
2014-01-30T01:29:23
1391045363
GP202368
0
1391040000
2014-01-30T00:00:00
15.4
59.7
5.2
41.3
1.
10:07
上午8:11
下午6:18
19
2.
30
19
-999.99
-999.99
部分云-sm.png
多云
部分多云.png
0
0
33
8.
0
0
西北
-999.99
-999.99
16
10
大部分时间阳光明媚
1.
1391126400
2014-01-31T00:00:00
16
60.8
5.
40.9
2.
10:09
上午8:10
下午6:19
18
2.
30
19
-999.99
-999.99
部分云-sm.png
多云
部分多云.png
0
0
46
28
0
0
西尼罗河
-999.99
-999.99
13
8.
大部分时间阳光明媚
2.
1391212800
2014-02-01T00:00:00
18.1
64.5
6.4
43.5
3.
10:12
上午8:09
下午6:21
46
2.
49
31
-999.99
-999.99
小雨阵雨sm.png
小雨阵雨
light-rain-shower.png
0.2
0.09
35
27
0
0
西尼罗河
-999.99
-999.99
22
14
小雨阵雨
3.
1391299200
2014-02-02T00:00:00
15.9
60.7
4.2
39.6
4.
10:14
上午8:08
下午6:22
12
2.
41
26
-999.99
-999.99
sunny-sm.png
晴朗的
sunny.png
0
0
34
0
0
0
西尼罗河
-999.99
-999.99
19
12
晴朗的

请不要将此链接为的副本,因为代码已做了重大更改。

您似乎没有检查XML是否如您所期望的那样。例如,当我运行您的代码时,我得到了以下XML:

<?xml version="1.0" encoding="utf-8"?>
<data>
   <status>error</status>
   <errorCode>00001</errorCode>
   <errorMessage>Request quota has been exceeded.  Please contact support.</errorMessage><errorMethod></errorMethod>
   <errorModule>api</errorModule>
</data>

没有其他人可以正确调试您的代码,因为您正在调用一个我们无法确定的url(您有未知变量
纬度
经度

我已经调试了行
xDoc.Root.Element(“forecast”).Element(“pop”).Value
,其中xDoc是从您给出的长xml文本创建的,没有例外。因此,我可以提出以下建议

  • 确保
    n.Result
    是您认为的内容。将其记录在某个位置,以确保它不是空白字符串、json字符串或任何其他意外内容

  • 请尝试查明null引用异常发生的确切位置。为此,请取消对所有方法调用的锁定,并每行有一个方法调用:

    var root = xDoc.Root;
    var forecast = root.Element("forecast");
    var pop = forecast.Element("pop");
    var popValue = pop.Value;
    tempnow.Text = popValue;
    

  • 然后,至少您会确切地知道异常来自何处。

    您给出的代码与您在此处展示的精确XML配合使用。您应该进行调试,以准确地检查导致NullReferenceException的原因-is
    tempnow
    null?is
    xDoc.Element(“预测”)
    null?is
    xDoc.Element(“预测”).Element(“pop”)
    null?这就是为什么在这里很奇怪,它们似乎都不是null。我觉得这很难相信,除非你真的没有运行你认为自己是的代码。(真的不清楚你为什么要使用
    debug2.Text
    部分…这似乎是不相关的,所以我把它去掉。)我建议您尝试编写一个控制台应用程序,直接使用
    XDocument.Load
    (传递URL)加载XML,并尝试以这种方式重现问题。然后我们可以非常轻松地检查它。一定是这样。据我所知,pop的值应该是19,而forecast是导致pop的一个元素。有多个XML中的“forecast”元素,但我几乎可以肯定,如果我没有另外指定,它只会选择它的第一个实例。我将尝试控制台应用程序,而debug2.text是相关的,您只是看不到它相关的代码。几乎所有的
    NullReferenceException
    情况都是相同的。请参见““对于一些提示。它似乎来自.Element(“pop”);。我怀疑纬度/经度可能与此问题有关,例如,如果它是在下载StringAsync部分之后执行的,因此我的web服务可能会给pop一个空值。
    var root = xDoc.Root;
    var forecast = root.Element("forecast");
    var pop = forecast.Element("pop");
    var popValue = pop.Value;
    tempnow.Text = popValue;