2011-01-13 39 views
2

它已经两天,我对XML解析问题的斗争,它仍然尚未完成:)DOM元素的内存分配管理的Xerces-C

好,很多trils后,我终于决定使用Xerces的-C在我的C++应用程序中解析xml。

嗯......我试过了TinyXml,RapidXml和其他......当从内存分配的角度来管理节点时,Xerces的行为也同样如此。

那么,DOMElement,DOMDocument,DOMNode tey都是私有构造类......我知道它是为了确保解析时的最佳性能,但在尝试管理类之间的节点时它确实是一件坏事。

我有这个问题。 我想创建一个存储xml文档的类(一个DOM对象,它具有我想要的所有节点,并且可以自由导航,所以它不是字符串var,而是DOM obj,我想DOMElement/DOMDocument是好)。那么这个对象是我班的成员。在我的类中使用函数我想让这棵DOM Tree及时增长...在内部我保留树,当我想要时,我将它打印到一个文件中。 这就是我想要做的。我知道这似乎很奇怪,但这是我的要求。我必须这样做,其他解决方案不被视为......对不起。 (我应该告诉你为什么这是实现的原因,但这需要很多时间)。

表达这种代码,下面几行是我想达到什么样的表示:

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; 
}; 

考虑由私有构造函数的所有限制,我只能从XercesDOMParser得到一个DOMDocument,我得到的指针,我怎么能做到这一点... 如果在构造函数中我这样做:

MyTree::MyTree() { 
    XercesDOMParser parser; 
    parser.parse(XMLString::transcode("<...>...</...>")); 
    this->_xmldoc = parser.getDocument(); 
} 

分配给_xmldoc文档后,构造函数超出范围和解析器被删除,所以ev所以我的_xmldoc将指向什么都没有...

我该如何解决这个问题?

谢谢...

回答

2

你需要保持解析器。将它作为参数传递(通过引用),使其成为MyTree(再次,作为参考)的成员,或将其放入单例类中。

_xmldoc应该是一个指针,顺便说一句。)

+0

是的,我选择保持解析器,我不知道这是前进的正确道路...但如果你这么说...谢谢你。 – Andry 2011-01-13 14:51:10