在 pugi xml_node 中保存 PUGI XML 树的子树
Saving sub-tree of PUGI XML tree in a pugi xml_node
在一个函数中,我使用 pugi 首先加载一个 XML 文件。然后我遍历树的 xml 个子节点,并将一些 xml 个子节点(xml_node 类型的对象)推送到 xml_node 的向量。但是一旦我退出这个函数,从 XML 文件加载的原始 XML 树结构对象就会被删除,导致 xml 个节点的向量中的元素变得无效。
下面是一个示例代码(快速编写)来展示这一点:
#include "pugixml.hpp"
#include <vector>
void ProcessXmlDeferred( std::vector<pugi::xml_node> const &subTrees )
{
for( auto & const node: subTrees)
{
// parse each xml_node node
}
}
void IntermedProcXml( pugi::xml_node const &node)
{
// parse node
}
std::vector<pugi::xml_node> BuildSubTrees(pugi::xml_node const & node )
{
std::vector<pugi::xml_node> subTrees;
pugi::xml_node temp = node.child("L1");
subTrees.push_back( temp );
temp = node.child.child("L2");
subTrees.push_back( temp );
temp = node.child.child.child("L3");
subTrees.push_back( temp );
return subTrees;
}
void LoadAndProcessDoc( const char* fileNameWithPath, std::vector<pugi::xml_node> & subTrees )
{
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load( fileNameWithPath );
subTrees = BuildSubTrees( result.child("TOP") );
IntermedProcXml( result.child("CENTRE") );
// Local pugi objects("doc" and "result") destroyed at exit of this
// function invalidating contents of xml nodes inside vector "subTrees"
}
int main()
{
char fileName[] = "myFile.xml";
std::vector<pugi::xml_node> myXmlSubTrees;
// Load XML file and return vector of XML sub-tree's for later parsing
LoadAndProcessDoc( fileName, myXmlSubTrees );
// At this point, the contents of xml node's inside the vector
// "myXmlSubTrees" are no longer valid and thus are unsafe to use
// ....
// Lots of intermediate code
// ....
// This function tries to process vector whose xml nodes
// are invalid and thus throws errors
ProcessXmlDeferred( myXmlSubTrees );
return 0;
}
因此,我需要一种方法来获取原始 XML 树的 save/copy/clone/move 子树(xml 节点),以便我可以安全地解析它们稍后点甚至在删除原始 XML 根树对象之后。如何在 pugi 中执行此操作?
只需将 xml_document 对象的所有权传递给调用者即可。
您可以通过强制调用者提供一个 xml_document 对象(向函数添加一个 xml_document&
参数),或者通过返回一个 shared_ptr<xml_document>
或 unique_ptr<xml_document>
来自节点向量旁边的函数。
在一个函数中,我使用 pugi 首先加载一个 XML 文件。然后我遍历树的 xml 个子节点,并将一些 xml 个子节点(xml_node 类型的对象)推送到 xml_node 的向量。但是一旦我退出这个函数,从 XML 文件加载的原始 XML 树结构对象就会被删除,导致 xml 个节点的向量中的元素变得无效。
下面是一个示例代码(快速编写)来展示这一点:
#include "pugixml.hpp"
#include <vector>
void ProcessXmlDeferred( std::vector<pugi::xml_node> const &subTrees )
{
for( auto & const node: subTrees)
{
// parse each xml_node node
}
}
void IntermedProcXml( pugi::xml_node const &node)
{
// parse node
}
std::vector<pugi::xml_node> BuildSubTrees(pugi::xml_node const & node )
{
std::vector<pugi::xml_node> subTrees;
pugi::xml_node temp = node.child("L1");
subTrees.push_back( temp );
temp = node.child.child("L2");
subTrees.push_back( temp );
temp = node.child.child.child("L3");
subTrees.push_back( temp );
return subTrees;
}
void LoadAndProcessDoc( const char* fileNameWithPath, std::vector<pugi::xml_node> & subTrees )
{
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load( fileNameWithPath );
subTrees = BuildSubTrees( result.child("TOP") );
IntermedProcXml( result.child("CENTRE") );
// Local pugi objects("doc" and "result") destroyed at exit of this
// function invalidating contents of xml nodes inside vector "subTrees"
}
int main()
{
char fileName[] = "myFile.xml";
std::vector<pugi::xml_node> myXmlSubTrees;
// Load XML file and return vector of XML sub-tree's for later parsing
LoadAndProcessDoc( fileName, myXmlSubTrees );
// At this point, the contents of xml node's inside the vector
// "myXmlSubTrees" are no longer valid and thus are unsafe to use
// ....
// Lots of intermediate code
// ....
// This function tries to process vector whose xml nodes
// are invalid and thus throws errors
ProcessXmlDeferred( myXmlSubTrees );
return 0;
}
因此,我需要一种方法来获取原始 XML 树的 save/copy/clone/move 子树(xml 节点),以便我可以安全地解析它们稍后点甚至在删除原始 XML 根树对象之后。如何在 pugi 中执行此操作?
只需将 xml_document 对象的所有权传递给调用者即可。
您可以通过强制调用者提供一个 xml_document 对象(向函数添加一个 xml_document&
参数),或者通过返回一个 shared_ptr<xml_document>
或 unique_ptr<xml_document>
来自节点向量旁边的函数。