Управление распределением памяти элементов DOM на Xerces-C - PullRequest
2 голосов
/ 13 января 2011

У меня было два дня, чтобы бороться с проблемами разбора 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 Ответ

2 голосов
/ 13 января 2011

Вы должны держать парсер рядом. Либо передайте его в качестве аргумента (по ссылке), либо сделайте его членом MyTree (снова в качестве ссылки), либо поместите его в одноэлементный класс.

(_xmldoc должен быть указателем, кстати.)

...