Управление выделением памяти для элементов DOM на Xerces-C
У меня было два дня, чтобы бороться с проблемами разбора XML, и это все еще не закончено:)
Что ж, после многих попыток я наконец решил использовать Xerces-C для разбора xml в моем приложении C++.
Ну что ж... Я пробовал TinyXml, RapidXml и другие.... Xerces тоже ведет себя одинаково при управлении узлами с точки зрения распределения памяти.
Ну, DOMElement, DOMDocument, DOMNode - все они являются закрытыми классами конструкций... Я знаю, что это обеспечивает лучшую производительность при разборе, но это становится очень плохо при попытке управлять узлами между классами.
У меня есть эта проблема. Я хотел бы создать класс, в котором будет храниться документ XML (объект DOM, в котором есть все нужные мне узлы, и по которому я могу свободно перемещаться, так что это не строковая переменная, а объект DOM, я полагаю, DOMElement/DOMDocument хорош). Ну, этот объект является членом моего класса. Используя функции в моем классе, я хочу, чтобы это дерево DOM росло со временем... Внутренне я сохраняю дерево, и когда я хочу, я печатаю его в файл. Это то, что я хочу сделать. Я знаю, что это кажется странным, но это мое требование. Я должен сделать это, любое другое решение не должно рассматриваться... извините. (Я должен рассказать вам причину, почему это реализация, но это займет много времени).
Выражая это в коде, следующие строки представляют собой то, чего я хотел бы достичь:
class MyTree {
public:
MyTree();
^MyTree(); // It is a tilde :)
// Methods
void AddToTree(std::string el); // Adds a new node somewhere in the DOM
std::string GetTree(); // Inserts the tree in a string
private:
DOMDocument _xmldoc;
};
Учитывая все ограничения, вызванные частными конструкторами, и то, что я могу получить DOMDocument только из XercesDOMParser, и я получаю указатель, как я могу добиться этого... Если в конструкторе я делаю так:
MyTree::MyTree() {
XercesDOMParser parser;
parser.parse(XMLString::transcode("<...>...</...>"));
this->_xmldoc = parser.getDocument();
}
После назначения _xmldoc документа, функция конструктора выходит из области видимости, и анализатор удаляется, и поэтому каждый принадлежащий ему компонент, так что мой _xmldoc ничего не будет указывать...
Как я могу решить эту проблему???
Спасибо...
1 ответ
Вы должны держать парсер рядом. Либо передать его в качестве аргумента (по ссылке), сделать его членом MyTree
(опять же, для справки) или поместите его в одноэлементный класс.
(_xmldoc
должен быть указатель, кстати.)