|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Доброго времени суток. Прилетела интересная задача, два дня уже реализацию придумать не могу..) Суть: есть две выборки данных, за определенный период, в xml. Вот таких: xEl1 Код: 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. 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.
xEl2 Код: 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.
Необходимо сравнить их и сделать выборку вида xElCompare Код: 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. 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.
Или словами - если в каждом xml (xEl1, xEl2) есть XElement с одинаковым XAttribute("Value"), то добавить в результат этот XElement с атрибутами xEl1.XAttributes + xEl2.Attributes, если такой XElement встречается только в одном из xml, то добавить в результат этот XElement с исходными атрибутами, а недостающие забить нулями. Есть ли у кого идеи как это реализовать? З.Ы. Гугл мне предложил толко один достойный вариант https://stackoverflow.com/questions/37666529/linq-xelement-compare , но что-то под себя я его переделать не смог =) Буду рад советам. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 07:03 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
В последнем вашем примере есть строка Код: xml 1.
Что-то мне подсказывает, что в одном элементе два атрибута с одинаковым именем (например «Count») не уживутся. Тут надо или им имена как-то менять или с неймспейсами баловаться. Или более по-другому задачу (и потребное решение) переформулировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 09:58 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Colt, совершенно верно! Атрибуты должны быть с разными именами. Здесь так потому, что этот пример я собирал буквально в ручную, в блокноте, и менять имя в каждой ноде и каждом атрибуте ну такое себе.. Должно получиться, ну пусть так: Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 10:21 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Код: xml 1.
А почему атрибут «Value» представлен только в одном экземпляре? Он что, особенный? Где «Value_old» и «Value_new»? Это я все к тому, что пока постановка задачи не совсем понятна (возможно только мне). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 11:19 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Ну вот условно говоря сейчас делаю так: Код: 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.
И получаю Код: xml 1. 2. 3. 4. 5. 6.
Но если поменяю выборки местами (xEl2, xEl1), то уже Код: xml 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 11:29 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Colt А почему атрибут «Value» представлен только в одном экземпляре? Он что, особенный? Извините, невнимательно прочитал ТЗ, он действительно особенный ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 11:55 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Colt, возможно, для того чтобы была более ясна картина, в конечном итоге пользователю будет предоставлена такого рода сводная таблица (всю таблицу забивать уж не стал, думаю общая идея понятна): Сводная таблица - - период1 - - период2 -Статус кол-во масса проценткол-во масса процентОтлично57189.774 48.45 5894.07640.02Хорошо1930.81816.15812.9765.52Уд62.4335.134.8662.07Плохо32.4332.55000-Отлично57 18.774 48.45 58 94.076 40.02длина120 129.76 17 0 0 0drill20 129.76 17 0 0 0длина237 60.014 31.45 58 94.076 40.02drill36 58.392 30.6 55 89.21 37.95drill1 1 1.622 0.85 3 4.866 2.07-Хорошо19 30.818 16.15 8 12.976 5.52длина119 30.818 16.15 8 12.976 5.52-Уддлина1длина2-Плоходлина1длина2 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 12:17 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Может у вас есть xsd-схема файлов (или вы ее сможете сами сделать)? Это к тому, чтобы было четко понятно какие элементы и атрибуты встречаются и какую структуру вложенности они подразумевают. Возможно это облегчит понимание ТЗ и создание решения. Что-то у меня крутиться мысля провернуть это через xslt-преобразование или через LINQ. Но, может, и зря крутиться, может это проще делать как-то по-другому... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 12:39 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Colt, да, конечно: xsd Код: 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. 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.
По сути, через Linq сейчас и пытаюсь что-то сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 13:12 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Несколько вопросов по схеме: 1. Элемент TIME_PERIOD действительно может встречаться несколько раз (причем не обязательно в начале файла) или даже вовсе отсутствовать (согласно схеме именно так)? Или он должен быть ровно один раз, причем в начале? 2. Все атрибуты описаны как необязательные, это действительно так, или они все-таки обязательно должны быть? 3. Для элементов DEFFECT_GROUP и DEFFECT типы атрибутов описаны как xs:string, xs:int и xs:double, а для элементов STATUS, RESULT_PRODUCTION_LENGTH и DRILLED они все указаны как xs:string. Почему? Может это и не принципиально, но хотелось бы внести ясность ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 14:27 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Colt, Colt1. Элемент TIME_PERIOD действительно может встречаться несколько раз (причем не обязательно в начале файла) или даже вовсе отсутствовать (согласно схеме именно так)? Или он должен быть ровно один раз, причем в начале? Согласно схеме это так, но по факту, TIME_PERIOD всегда будет только один раз, и только в начале. Colt2. Все атрибуты описаны как необязательные, это действительно так, или они все-таки обязательно должны быть? Да, совершенно верно, все элементы не обязательные. По факту, всегда будут только mainElement и TIME_PERIOD. Все остальные могут как отсутствовать, так и повторяться несколько раз. По факту, STATUS может повториться не более 4 раз, RESULT_PRODUCTION_LENGTH не более 3 раз, элементы DEFFECT_GROUP и DEFFECT - много, несколько десятков повторений запросто. Colt3. Для элементов DEFFECT_GROUP и DEFFECT типы атрибутов описаны как xs:string, xs:int и xs:double, а для элементов STATUS, RESULT_PRODUCTION_LENGTH и DRILLED они все указаны как xs:string. Почему? Такс, я - косяк. Каюсь, как-то пропустил не заметил string (хотя вроде менял...). Все атрибуты для всех элементов Код: xml 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 14:58 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
mozgen Colt2. Все атрибуты описаны как необязательные, это действительно так, или они все-таки обязательно должны быть? Да, совершенно верно, все элементы не обязательные. Я тут уточнял про обязательность атрибутов, а не элементов ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 15:04 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Чур, не плеваться (я сам в LINQ очень сильно не доцент), наверное, можно было сделать как-то более просто и красиво, но пока так: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 16:46 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Colt, Хм. Премного благодарствую. Все (как регулярно и случается) намного проще и логичнее моих потугов =) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2020, 06:35 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
А не проще было бы сделать классы (тем более раз уж есть xsd), XML десериализовать в эти классы, для классов реализовать компараторы, ну и потом сравнивать коллекции/экземпляры этих классов, а не возиться со сравнением значений атрибутов-узлов? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2020, 06:53 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, в чем-то да, вы правы, было бы проще. Но, честно говоря, чет гонять постоянно xml в классы и обратно, ну такое себе. Нет, я не спорю, так даже удобнее, возможно. Но интерес представлял именно вопрос сравнения двух XElement. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2020, 09:59 |
|
Сравнение XElement'ов
|
|||
---|---|---|---|
#18+
mozgen Но, честно говоря, чет гонять постоянно xml в классы и обратно, ну такое себе. XmlSerializer.Deserialize В 99% случаев эта десериализация умещается в 2-3 строки кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2020, 10:13 |
|
|
start [/forum/topic.php?fid=20&fpage=11&tid=1398588]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 36ms |
total: | 199ms |
0 / 0 |