Управление выделением памяти для элементов 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 должен быть указатель, кстати.)

Другие вопросы по тегам