0

我目前正在编写将使用 pugixml 模块读取 xml 文件的代码。在我的 xml 文件中,我有几个形状节点,它们由获取数字的 shape_id 属性区分。对于特定的需要,我将 shape_id 数字存储在一个整数中,尽管在 xml 文件中,相应属性的值当然是 a string(或者char,必须检查)。

为了检索特定的形状节点,例如属性 shape_id = 2(仅举个例子),我编写了下面的函数。

pugixml 提供了一个find_child_by_attribute()带有此调用定义的函数:

PUGI__FN xml_node xml_node::find_child_by_attribute(const char_t* name_, const char_t* attr_name, const char_t* attr_value) const

如您所见,它将属性值请求为 char 指针。

我设法使它与代码中的两行一起工作:

char char_shape_id = static_cast<char>(shape_id);
char* shape_id_ptr = &char_shape_id;

首先,我将整数shape_id转换为 char,然后获取该 char 的地址并将其存储到 char 指针中。我认为这是一种尴尬的方式,但我无法弄清楚如何以更优雅的方式做到这一点。

我试过跟随但失败了。

char* shape_id_ptr = &(static_cast<char>(shape_id));

这似乎是无效的代码。

当我在返回行中有以下函数调用时,似乎也有效:

return root_node.child(sNodeNames.case_def_name.c_str()).find_child_by_attribute(sNodeNames.shape_name.c_str(),"item_id", (char*)shape_id);

我还尝试使用 unique_ptr 或 shared_ptr 代替原始 char 指针,但不知何故我无法弄清楚如何使该指针与find_child_by_attribute(). 我的共享指针定义当前是

char char_shape_id = static_cast<char>(shape_id);
std::shared_ptr<char> shape_id_ptr(&char_shape_id);

但正如我所说,该功能不接受这一点。

//returns the node shape with a given shape_id number
pugi::xml_node nXml::tXmlShape::GetShapeNode(const int shape_id, const pugi::xml_node& root_node)
{
    char char_shape_id = static_cast<char>(shape_id);
    char* shape_id_ptr = &char_shape_id;

    nXml::sXmlNodeNames sNodeNames;
    nXml::sXmlShapeTypes sShapeTypes;
    return root_node.child(sNodeNames.case_def_name.c_str()).find_child_by_attribute(sNodeNames.shape_name.c_str(),"item_id", shape_id_ptr);
}
;

除了非常丑陋的返回行措辞之外,还有一种更优雅的方式来完成将原始整数值的 char 指针传输到函数,我如何unique_ptr分别用 a 来实现这一点shared_ptr

4

0 回答 0