1 / 1 / 0
Регистрация: 04.02.2020
Сообщений: 16
|
||||||
1 | ||||||
Поиск и выполнение операции с текстом внутри тега04.02.2020, 21:44. Показов 1915. Ответов 5
Метки нет (Все метки)
Здравствуйте, нужна помощь.
Я написал класс, поиска тега и подготовку (по тегу) текста для записи в FollowDocument. Проблема в том, что метод вызывает сам себя для обработки теста из-за чего возникает исключение System.StackOverflowException. Как можно переписать метод, чтобы это исключение не появлялось?
Забыл пометить: Возникающая рекурсия замкнутая, она в любом случае заканчивается по достижению самого верхнего тега.
0
|
04.02.2020, 21:44 | |
Ответы с готовыми решениями:
5
Поиск родительского тега, содержащего элемент с текстом ORA-14551: невозможно выполнение операции DML внутри запроса Нужно сделать, чтобы значение атрибута тега отображался внутри этого тега Получение ссылки из тега внутри другого тега |
Модератор
|
|
04.02.2020, 22:08 | 2 |
Код большой и немного путанный.
Полностью не разбирал. Пару вопросов: Какое отношение этот вопрос имеет к WPF? Наверное, вашу тему надо перенести в другой раздел. Обратил внимание, что вы ищете открывающий тег, извлекаете его, ищете в нём вложенные и т.д. Из-за этого возникают неоправданные рекурсии. Не зная формата вашего документа, не могу точно сказать. Но обычно типовой сценарий обработки скобок, тегов основан на поиске первой закрывающей скобки, тега. Априори она принадлежит тегу самого нижнего уровня и при его обработке рекурсии не возникает. После обработки этого тега ищется следующий закрывающий и при его обработке вложенный используется как уже сформированное значение. И т.д. Такая обработка по закрывающим тегам, обычно позволяет значительно уменьшить или, вообще, избавиться от рекурсий.
0
|
1 / 1 / 0
Регистрация: 04.02.2020
Сообщений: 16
|
||||||
04.02.2020, 22:34 [ТС] | 3 | |||||
К WPF класс имеет косвенное отношение, так как просто составляет код для разметки, которая уже позже загружается отдельным методом в потоковый документ WPF.
Код путанный по причине, что я хоть и довольно сильно изучил C#, но все же не имею большого опыта. После нахождения первого тега метод сначала записывает его в хранилище, а уже потом ищет следующий, первый закрывающийся тег такого же типа. После чего выделает ему нужные данные (вложенные теги) и отправляет выделенные данные на новую обработку, а новый обработчик уже сам отправляет и т.д. В общем это происходит пока он просто не сможет найти открывающийся тег и отправить все данные назад. Если сказать проще здесь намеренная рекурсия, но увы, я не ожидал, что есть исключение связанное с этим. Добавлено через 8 минут А, да формат, класс принимает текст формата "Этот ["b"]текст["Font"] переводиться["/Font"].["/b"]" (без всех ковычек), получая на выходе что-то подобное:
0
|
Модератор
|
|
04.02.2020, 23:05 | 4 |
Я бы посоветовал разделить задачи работы с данными и их представлением.
WPF решает только задачу представления данных. И в этом разделе вам возможно придётся долго ждать помощи, если, вообще, её дождётесь. Вашу тему лучше перенести в раздел для начинающих. Там больше задач такого типа. Для решения же задачи по существу, в первую очередь, дайте пример ваших данных и требуемого их разбора. Ни кто не будет по вашему коду заниматься воссозданием данных и алгоритма. И код ваш скорее всего придётся выбросить. Он даже для вас труден в чтении. Очень сомневаюсь, что кто-то станет его разбирать. Его надо конкретно рефакторить - разбивать на методы. Не должно методов с кодом больше одной страницы - одно из правил хорошего кода. Добавьте хотя бы нормальные комменты к каждому участку кода.
0
|
1 / 1 / 0
Регистрация: 04.02.2020
Сообщений: 16
|
||||||
04.02.2020, 23:59 [ТС] | 5 | |||||
Хорошо, чуть позже я займусь разборкой кода, может смогу найти другой алгоритм, в котором отсутствует рекурсия.
Насчет переноса темы, увы, я новичок на форуме и не знаю как это здесь сделать, буду благодарен если отпишите как. Добавлено через 23 минуты Суть проблемы: В первом сообщении представлен рабочий код, в ходе которого текст из такого формата: "Этот ["b"]текст["Font"] переводиться["/Font"].["/b"]" (без всех ковычек) Собирается в код разметки Xaml такого формата:
При небольшом количестве тегов 2-3, исключение о рекурсии не возникает и код собирается правильно, но при большем количестве выскакивает исключение. Как можно переписать метод, чтобы он не вызывал сам себя? Добавлено через 18 минут Алгоритм кода: В открытый метод Parse передается строка, которая сразу разбивается на строковой массив (List), разделителями являются сами теги, которые так же записываются в этот массив. После, массив передается в другой, приватный, метод Parse который обрабатывает текст: 1. Ищет первый попавшийся ему тег; 2. Проверяет, точно ли был тег найден, если нет собирает текст в нужный формат с учетом тегов уже записанных в хранилище tags и возвращает значение; 3. Избавляется от скобок в теге и разбивает на варианты, если присутствуют, добавляет тег в хранилище tags; 4. Собирает текст, находящийся до тега в нужный формат; 5. Ищет второй закрывающийся тег; 6. Смотрит, находятся ли вложенные теги, если да то вытаскивает текст между закрывающими тегом и последним найденным вложенным тегом и собирает в нужный формат. Если вложенных тегов не имеется собирает весь текст между текущими тегами в формат; 7. Отправляет вложенные теги в новый обработчик, при этом передавая уже существующие теги; 8. Отправляет в новый обработчик текст после текущих тегов; 9. Собирает код и возвращает его;
0
|
1 / 1 / 0
Регистрация: 04.02.2020
Сообщений: 16
|
||||||
05.02.2020, 14:29 [ТС] | 6 | |||||
Сам нашел решение проблемы, полностью избавился от всех рекурсий.
Если кому понадобиться оставляю переписанный класс:
1
|
05.02.2020, 14:29 | |
05.02.2020, 14:29 | |
Помогаю со студенческими работами здесь
6
Скрипт идентификации тега внутри другого тега "невозможно выполнение операции DML внутри запроса" Как сделать заголовок просто текстом, без тега h2? Теги внутри тега a Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |