Хотелось бы узнать, что будет эффективнее, если стоит такая задача:
Есть xml файл, нужно написать свой парсер (не используя библиотеки др. разработчиков, типа libxml, expat и др.)
Т.е. к примеру xml такой:
Код: Выделить всё
<a>
[b][/b]
</a>
1) Определяем начало и конец каждого тега (т.е. позицию "<" и ">")
Вопрос: если нам за ранее не известно число тегов, то тут явно нужен динамический массив, но как лучше сделать?
а) первый раз пропарсить текст, подсчитать кол-во "<" и кол-во ">", затем на основании этого создать динамический массив. И дальше уже по второму разу парсить текст и заносить в этот массив позиции начала/конца тега ("<" и ">").
б) сразу создать динамический массив, учитывая то, что в минимальном случае число "<" будет равно
Код: Выделить всё
angel_brackets = sizeof(xml_string)/sizeof(char) / 4 + 1;
или
angel_brackets = ((sizeof(xml_string)/sizeof(char)) >> 2) + 1;
Значит можно создавать динамический массив из left_angel_brackets элементов. Если в данном примере все нормально (см. выше) и число скобок можно вычислить с небольшой погрешностью (в сторону увеличения), то если пример будет содержать не пустые теги, а текст и имена тегов будут длинные, то избыток будет ОЧЕНЬ заметным... в n раз. Получается расход памяти увеличивается....Что плохо.
Как тут лучше поступить?
2) Парсим от первой "<" до первой ">" получаем имя открывающегося тега + параметры (если например <a id="123">) и т.д. от второй "<" до второй ">" - второй тег. С проверкой того, чтобы за "<" не следовал символ "/" иаче это закрывающийся тег.
3) сохраняем все это в какую-то структуру.
Вопрос: как хранят структуру XML? Нужно смотреть в сторону деревьев? Может кто подскажет, куда копать?
Это общая такая концепция, является ли она здравой? Или совсем не годится?
Спасибо.