Неправильный синтаксический анализ данных XML с Linq to XML - PullRequest
0 голосов
/ 09 декабря 2011

решено - Спасибо всем за помощь!

Прежде чем перейти к своему коду, я хотел бы предложить краткое объяснение того, чего я пытаюсь достичь. У меня есть XML-файл в папке Data, который имеет 3 элемента на потомка: месяц, максимум и минимум. Каждый потомок уже находится в соответствующем порядке в зависимости от месяца, но мне нужно преобразовать верхнюю и нижнюю строки в двойные, чтобы я мог использовать их для построения точек на графике. Это та часть, которую я не могу выполнить.

Что у меня так далеко:

    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, например, при 25 ° C будет отображаться временная температура 25 февраля)

Файл 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>

Ответы [ 4 ]

4 голосов
/ 09 декабря 2011

Правильно ли 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
}

Кроме того, как уже отмечали другие, попробуйте разбить ваш код на более мелкие методы, он будет более читабельным и более удобным для поддержки таким образом

3 голосов
/ 09 декабря 2011

XML чувствителен к регистру.Исправьте ваш селектор, чтобы быть .Descendants("Temp")

0 голосов
/ 09 декабря 2011

2 способа.

Вы можете сделать Convert.ToDbouble (string), как предложено выше, но будет сгенерировано исключение, если он не сможет проанализировать число.

Вы можете попробовать

double d;
Double.TryParse(strToParse, out d);
0 голосов
/ 09 декабря 2011

Вы пробовали,

Convert.ToDouble(string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...