2011-01-13 5 views
2

Это было два дня для меня бороться с проблемами XML разбора и она до сих пор еще не закончена :)DOM диспетчеризация элементов памяти на Xerces-C

Ну, после многих trils я, наконец, решил использовать Xerces -C для разбора xml в моем приложении C++.

Ну ... Я попробовал TinyXml, RapidXml и другие ... Xerces тоже ведут себя одинаково при управлении узлами с точки зрения распределения памяти.

Ну, DOMElement, DOMDocument, DOMNode tey все являются частными конструктивными классами ... Я знаю, что он предназначен для обеспечения наилучшей производительности при разборе, но при попытке управлять узлами между классами становится очень плохо.

У меня есть эта проблема. Я хотел бы создать класс, в котором хранится XML-документ (объект DOM, который имеет все узлы, которые я хочу, и что я могу свободно перемещаться, поэтому это не строка var, а DOM obj, я полагаю, 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 документа, функция конструктора выходит из области видимости и синтаксического анализа удаляется, и поэтому ev , поэтому мой _xmldoc не укажет на ничего ...

Как я могу решить эту проблему ???

Спасибо ...

ответ

2

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

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

+0

Да, я решил сохранить синтаксический анализатор, и я не был уверен, что за это будет правильный путь, чтобы продолжить ... но если ты так говоришь ... что ж, спасибо тебе. – Andry

+0

Это, к сожалению, единственный способ. Раньше я был поражен дизайном этой библиотеки. –