使用Linq to XML不能正确解析XML数据

本文关键字:XML 数据 不能 Linq to 使用 | 更新日期: 2023-09-27 18:17:23

SOLVED -谢谢大家的帮助!

在我开始写代码之前,我想提供一个简短的解释,我想要完成的是什么。我在Data文件夹中有一个XML文件,每个后代有3个元素:Month、High和Low。每个子代都已经按照Month的顺序排列好了,但是我需要将high和low字符串转换为double,这样我就可以使用它们在图上绘制点。那是我不能完成的部分。

目前为止我有什么:

    double month = 25;
    const double temp = 275;
    string path = AppDomain.CurrentDomain.BaseDirectory + "''Data''";
    XDocument xmlSource;
    private void btnShowAlbany_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            //Brush, Polyline, PointCollection for drawing
            SolidColorBrush myBrush = new SolidColorBrush(Color.FromArgb(255, 255, 0, 0));
            Polyline myLine = new Polyline();
            myLine.Stroke = myBrush;
            myLine.StrokeThickness = 2;
            PointCollection myPoints = new PointCollection();
            double theTemp = 0;
            //Get XML data
            xmlSource = XDocument.Load(path + @"'Albany.xml");
            var myTemps = from tmp in xmlSource.Descendants("temp")
                            select new
                            {
                                Month = tmp.Element("Month").Value,
                                High = tmp.Element("High").Value,
                                Low = tmp.Element("Low").Value
                            };
            //Pull out data for points
            foreach (var x in myTemps)
            {
                double high = Convert.ToDouble(x.High);
                double low = Convert.ToDouble(x.Low);
                theTemp = (high + low) / 2;
                myPoints.Add(new Point(month, temp - theTemp));
                month += 25;
            }
            //Add points to line, add line as child of canvas
            myLine.Points = myPoints;
            albanyCanvas.Children.Add(myLine);
        }
        catch
        {
            MessageBox.Show("Error accessing data source", "Show Temps", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

任何指导都很感激,谢谢。

(注意:我的画布网格值开始于25 X, 275 Y,例如。2月份25的温度将绘制为@ 50,250)

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<Temps>
  <Temp>
    <Month>Jan</Month>
    <High>31</High>
    <Low>15</Low>
  </Temp>
  <Temp>
    <Month>Feb</Month>
    <High>35</High>
    <Low>17</Low>
  </Temp>
  <Temp>
    <Month>Mar</Month>
    <High>44</High>
    <Low>26</Low>
  </Temp>
  <Temp>
    <Month>Apr</Month>
    <High>58</High>
    <Low>37</Low>
  </Temp>
  <Temp>
    <Month>May</Month>
    <High>69</High>
    <Low>47</Low>
  </Temp>
  <Temp>
    <Month>Jun</Month>
    <High>78</High>
    <Low>57</Low>
  </Temp>
  <Temp>
    <Month>Jul</Month>
    <High>82</High>
    <Low>62</Low>
  </Temp>
  <Temp>
    <Month>Aug</Month>
    <High>80</High>
    <Low>60</Low>
  </Temp>
  <Temp>
    <Month>Sep</Month>
    <High>72</High>
    <Low>52</Low>
  </Temp>
  <Temp>
    <Month>Oct</Month>
    <High>60</High>
    <Low>40</Low>
  </Temp>
  <Temp>
    <Month>Nov</Month>
    <High>48</High>
    <Low>32</Low>
  </Temp>
  <Temp>
    <Month>Dec</Month>
    <High>36</High>
    <Low>21</Low>
  </Temp>
</Temps>

使用Linq to XML不能正确解析XML数据

from tmp in xmlSource.Descendants("temp")是否正确?

您的XML节点称为Temp, XML区分大小写

你的double high = Convert.ToDouble(x.High);看起来很好,所以只要在XML中的数据是有效的,为了安全,你可以尝试像

double high;
if (!double.TryParse(x.High, out high)) {
    // handle error
}

另外,正如其他人指出的那样,试着把你的代码分解成更小的方法,这样会更容易读,更容易维护

XML区分大小写。修正你的选择器为.Descendants("Temp")

你试过了吗,

Convert.ToDouble(string)

两种方式

你可以像上面建议的那样做convert . todouble (string),但是如果它不能解析出数字将会抛出异常。

你可以试试

double d;
Double.TryParse(strToParse, out d);