Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 24

Нахождение максимума в XPath

22.11.2012, 02:56. Показов 1639. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Вопрос следующий. Есть небольшой xml в котором указаны сведения о рейсах самолетов: номер рейса, аэропорт, расстояние, стоимость билета, время полета. Нужно на основе этого файла сформировать еще один со сведениями о трех рейсах, имеющих наибольшое расстояние полета при цене не больше заданной пользователем.

Вот что сделал я:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.XPath;
 
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
 
        const string FILE_NAME = "data.xml";
        const string FILE_NAME_OUT = "data_out.xml";
 
        XPathDocument doc;
        XPathNavigator nav;
        XPathExpression expr;
        XPathNodeIterator iterator;
 
        private void button1_Click(object sender, EventArgs e)
        {
            string dis = textBox1.Text;
       //     if (str == "") return;
 
            XPathDocument doc = new XPathDocument(FILE_NAME);
          
            XPathNavigator nav = doc.CreateNavigator();
            XPathExpression expr;
            expr = nav.Compile("/catalog/cd[distance = max(..cd/distance)]"); // max
            XPathNodeIterator iterator = nav.Select(expr);
 
            listBox1.Items.Clear();
 
            try
            {
                while (iterator.MoveNext())
                {
                    XPathNavigator nav2 = iterator.Current.Clone();
 
                    nav2.MoveToFirstChild();
                    listBox1.Items.Add("Airport" + nav2.Value);
                    nav2.MoveToNext();
                    listBox1.Items.Add("Distance" + nav2.Value);
                    nav2.MoveToNext();
                    listBox1.Items.Add("Price" + nav2.Value);
                    nav2.MoveToNext();
                    listBox1.Items.Add("Time" + nav2.Value);
                    nav2.MoveToNext();
 
                }
                
                string strBox = listBox1.Text;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
 
 
        string oldTitle = "";
 
       
 
        private void button2_Click(object sender, EventArgs e)
        {   
 
            string str = textBox3.Text;
            if (str == "") return;
 
            oldTitle = str;
            const string FILE_NAME = "data.xml";
            XmlTextReader reader = new XmlTextReader(FILE_NAME);
            XmlDocument doc = new XmlDocument();
            
            doc.Load(reader);
            reader.Close();
 
 
            XmlNode oldCD;
            XmlElement root = doc.DocumentElement;
            //oldCD = root.SelectSingleNode("/catalog/cd[title='" + oldTitle + "']");
          //  oldCD = root.SelectSingleNode("/catalog/cd[title='" + oldTitle + "']");
            
 
            XmlElement newCD = doc.CreateElement("cd");
            newCD.SetAttribute("country", textBox4.Text);
            newCD.InnerXml = "<title>" + this.comboBox1.Text + "</title>" +
            "<artist>" + this.textBox2 + "</artist>" +
            "<price>" + this.textBox3 + "</price>";
            
       //     root.ReplaceChild(newCD, oldCD);
            doc.Save(FILE_NAME_OUT);
 
        }
 
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string str = comboBox1.Text;
            if (str == "") return;
 
            oldTitle = str;
            const string FILE_NAME = "data.xml";
            XPathDocument doc = new XPathDocument(FILE_NAME);
            XPathNavigator nav = doc.CreateNavigator();
            XPathExpression expr = nav.Compile("/catalog/cd[title='" + str + "']");
            XPathNodeIterator iterator = nav.Select(expr);
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            doc = new XPathDocument(FILE_NAME);
            
            nav = doc.CreateNavigator();
 
            // Compile a standard XPath expression
 
            expr = nav.Compile("/catalog/cd/airport");
            iterator = nav.Select(expr);
 
            // Iterate on the node set
            comboBox1.Items.Clear();
            try
            {
                while (iterator.MoveNext())
                {
                    XPathNavigator nav2 = iterator.Current.Clone();
                    comboBox1.Items.Add(nav2.Value);
 
                    nav2.MoveToNext();
                    textBox2.Text = nav2.Value;
                    nav2.MoveToNext();
                    textBox3.Text = nav2.Value;
 
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            comboBox1.SelectedIndex = 0;
 
            //save old title 
            oldTitle = comboBox1.Text;
        }
 
              
    }
}

XML выглядит так:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0"?>
<catalog>
  <cd flight_number = "1111">
    <airport>Roma</airport>
    <distance>10</distance>
    <price>100</price>
    <time>12</time>
  </cd>
  
  <cd flight_number = "1112">
    <airport>London</airport>
    <distance>13</distance>
    <price>150</price>
    <time>17</time>
  </cd>
  
  <cd flight_number = "1113">
    <airport>Paris</airport>
    <distance>8</distance>
    <price>120</price>
    <time>12</time>
  </cd>
  
  <cd flight_number = "1114">
    <airport>Praha</airport>
    <distance>9</distance>
    <price>200</price>
    <time>6</time>
  </cd>
  
</catalog>
По идеи выражение в 39 строчке должно выбирать максимальное расстояние полета, но программа ругается на это выражение, мол недопустимый token. Кроме того он выбирет всего один рейс, а мне нужно три с максимальными значениями. И как сделать сделать, чтобы вводимая пользователем цена участвовала в выражении. ТО есть если сделать "/catalog/cd[price<10]" все работает, но мне вместо десятки нужно подставлять значение введенное пользователем.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2012, 02:56
Ответы с готовыми решениями:

Нахождение максимума и минимума
Нахождение максимума и минимума: В двумерном массиве хранится информация о баллах, полученных спортсменами-пятиборцами в каждом из пяти...

Нахождение максимума из массива
Требуется ввести с клавиатуры массив и из этого массива найти максимально число.В чем ошибка...зарание спасибо! int x = new int; ...

Нахождение максимума из нескольких заданных значений
Ребят, помогите пожалуйста мне с моей программой. Нужно найти максимум из 4-х значений. using System; using...

3
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
22.11.2012, 07:30
Можно было бы отсортировать в убывающем порядке и взять первые три рейса. Но XPath не поддерживает сортировки.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
22.11.2012, 07:31
В .net, насколько я знаю, не реализован XPath 2.0, а именно во второй версии появился max.
Предлагаю такое выражение:
Code
1
//catalog/cd[not(//catalog/cd/distance > distance)]
Найдено тут

PS. Для отладки xpath запросов советую использовать XPathVisualizer
1
1 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 24
23.11.2012, 01:25  [ТС]
Спасибо, помогло Но как сделать, чтобы он выбирал не одну, а три записи? И еще остался открытым вопрос с значением вводимым пользователем. Как сделать так, чтобы оно участвовало в выражении выборки вместо цифры?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2012, 01:25
Помогаю со студенческими работами здесь

Нахождение индекса максимума и минимума в колонке
class FindWeather { static void Main(string args) { string lines = File.ReadAllLines(&quot;pogoda.txt&quot;);...

Нахождение локального максимума в одномерном массиве
Здравствуйте, вообщем задание не сложное, но почему ругается не пойму. Необходимо в массиве из N элементов найти локальный максимум. Вот...

Нахождение максимума и минимума графика функции на промежутке от -10 до 10
Написать программу, для нахождения максимумаи минимума графика функции на промежутке от -10 до 10. График функции: y= 2*x-x^2

Нахождение максимума в массиве, используя дженерики и интерфейс IComparable
Здравствуйте! Задание с сайта урлеан. Нахождение максимума в массиве с любыми типами данных, используя дженерики и интерфейс...

Нахождение максимума
Уважаемые программисты!Можно ли найти программно максимум в колонке табличногоПоля и вывести его в реквизит документа?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru