|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Привет Подскажите, пожалуйста, можно ли выразить такой запрос на XPath. Есть xml: Код: xml 1. 2. 3. 4.
C date всё понятно, time - время от начала суток в виде количества секунд. Нужно выбрать XmlNode где element содержит самую последнюю дату включая время суток. Или придётся выбирать все узлы и делать выборку в цикле? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 15:00 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Честно говоря, не знаю, но возможно поможет. Сначала нужно отсортировать ваши элементы, например: http://www.sql.ru/forum/1106056/sortirovka-elementov-xml. То есть XQuery, а не XPath А дальше, просто взять последний (первый) элемент в списке. А с чем связано ограничение на XPath? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 15:47 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Arm79, не, XQuery это же БД. А мне в C# надо. На уровне БД выбрать не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:07 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
rigorMortisArm79, не, XQuery это же БД. А мне в C# надо. На уровне БД выбрать не получится. Да? а эти: XQSharp and Saxon? C другой стороны, чем плох LINQ-to-XML? Зачем вам извращаться с XPath? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:12 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Arm79, Ну, вообще не обязательно XPath. Вопрос в том чтобы сделать более рационально чем писать метод для разбора даты элемента. А на LINQ-to-XML как сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:29 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
rigorMortisArm79, Ну, вообще не обязательно XPath. Вопрос в том чтобы сделать более рационально чем писать метод для разбора даты элемента. А на LINQ-to-XML как сделать? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Вывод: <element date="01.03.2014" time="7600" /> ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:49 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
rigorMortisА на LINQ-to-XML как сделать? Примерно так (не проверял): Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:49 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Надо попробовать... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:51 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
rigorMortisПодскажите, пожалуйста, можно ли выразить такой запрос на XPath Нельзя. Потому что нужно преобразование строк в даты, а XPath/XSLT версии 1.0 этого не умеют (а дотнетовские парсер/процессор работает именно с 1.0). Конечно, можно было бы порекомендовать Saxon HE (например), но и это бы не спасло - даты не в формате xs:date, и преобразование к типу xs:date выдаст ошибку. Хотя, остается еще вариант констрирования правильного формата через substring - но потом возникнут проблемы с нахождением максимума от двух аргуметов. Я бы сделал так: 1) тождественное пребразование с добавлением атрибута, содержащего дату+время в формате unix epoch: Код: 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.
получим Код: xml 1. 2. 3. 4.
и дальше всё совсем просто: Код: xml 1.
Но, повторюсь, это XPath/XSLT 2.0, если пользоваться можно только средствами фреймворка - проще распарсить и определить нужный тэг в коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:52 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:52 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
codearticles.ru Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
МСУ, а куда ты дел time? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:55 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Arm79МСУ, а куда ты дел time? Упс, виноват, 79 :) Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:56 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
codearticles.ruArm79МСУ, а куда ты дел time? Упс, виноват, 79 :) Код: c# 1. 2. 3. 4.
Эх, любишь ты все усложнять. AddSeconds сразу же бы сделал, и обошелся бы прекрасно без ерунды типа let max. Зачем дважды что-то прибавлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 16:59 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Arm79Эх, любишь ты все усложнять. AddSeconds сразу же бы сделал, и обошелся бы прекрасно без ерунды типа let max. Зачем дважды что-то прибавлять. Вся прелесть let в том, что оно вычисляется один раз и хранится в переменной диапазона. И может сколько угодно использоваться в запросе. Незаменимая штука в группировках-агрегатах. Жалко, что в лямбде нету такой фишки. Кстати, let будет оптимальнее, чем формирование сортировки типа OrderBy + Last. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 17:05 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
codearticles.ruArm79Эх, любишь ты все усложнять. AddSeconds сразу же бы сделал, и обошелся бы прекрасно без ерунды типа let max. Зачем дважды что-то прибавлять. Вся прелесть let в том, что оно вычисляется один раз и хранится в переменной диапазона. И может сколько угодно использоваться в запросе. Незаменимая штука в группировках-агрегатах. Жалко, что в лямбде нету такой фишки. Кстати, let будет оптимальнее, чем формирование сортировки типа OrderBy + Last. Может быть. Но тут уже вопрос компромисса - понятный код, хоть и работающий чуточку медленнее, или более быстрая, но некрасиво выглядящая конструкция? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 17:08 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
codearticles.ruArm79Эх, любишь ты все усложнять. AddSeconds сразу же бы сделал, и обошелся бы прекрасно без ерунды типа let max. Зачем дважды что-то прибавлять. Вся прелесть let в том, что оно вычисляется один раз и хранится в переменной диапазона. И может сколько угодно использоваться в запросе. Незаменимая штука в группировках-агрегатах. Жалко, что в лямбде нету такой фишки. Кстати, let будет оптимальнее, чем формирование сортировки типа OrderBy + Last. OrderBy + Last - возможно, а вот OrderByDescending + First - другое дело, ибо LINQ использует отложенное исполнение и запрос выполняется полностью, значит, первая итерация сортировки OrderByDescending находит первый элемент и функции First его достаточно, дальше сортировка выполняться не будет. Но при этом один проход, так что, думаю, это оптимальный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 17:11 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 17:17 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
codearticles.ruКстати, let будет оптимальнее, чем формирование сортировки типа OrderBy + Last. Вот раздразнил меня: Код: 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.
Вывод: 327 833 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 17:26 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Ilya81OrderBy + Last - возможно, а вот OrderByDescending + First - другое дело Один фиг. Только что проверил. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 17:28 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Arm79Вывод: 327 833 Ну, батенька, вам надо бы матчасть закрепить в области отложенных вычислений :) Код: c# 1.
Вывод: 301 125 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2014, 22:31 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
codearticles.ruArm79Вывод: 327 833 Ну, батенька, вам надо бы матчасть закрепить в области отложенных вычислений :) Код: c# 1.
Вывод: 301 125 ну, МСУ, при прочих равных... тогда уж и здесь к списку приведите var items = xDoc.Root.Elements("element"); ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2014, 07:44 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Arm79тогда уж и здесь к списку приведите Код: c# 1.
Ничего не поменяется. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2014, 09:13 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
Arm79, а вообще, если на то пошло, у тебя кривой тест. Тест с OrderBy + Last уже априори будет проигрывать по причине, потому что в нем есть конвертации времени и числа. Вот правильный тест. test let vs order Код: 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.
Вывод: 39, 24 P.S. Готовится единая коллекция в памяти и только потом по ней идут замеры. В целях оптимизации let был вынесен в отдельную переменную max. Те же яйца, только оптимальнее ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2014, 09:40 |
|
Cложный запрос XPath
|
|||
---|---|---|---|
#18+
codearticles.ru, Не согласен :-) Себе то ты заранее готовишь новый список: codearticles.ru Код: c# 1. 2.
А мне почему то вычисления в цикл пихаешь: codearticles.ru Код: c# 1.
Ты у меня тоже новый список с предрассчитанными данными сделай, а потом только тесть :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2014, 10:04 |
|
|
start [/forum/topic.php?fid=20&fpage=106&tid=1402403]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 143ms |
0 / 0 |