我正在使用xerces解析XML,并构建一个内部结构,稍后我可以遍历它。
作为此解析的一部分,我遇到了如下所示的可变数量的<Field_Delimited>元素:
<Field_Delimited>
<name>some_value</name>
<data_type>ASCII_Real</data_type>
<unit>some_value</unit>
<description>some_value</description>
</Field_Delimited>内存中将表示这些字段的结构(称为file_observational_area )是在全局文件级别声明的,参见相关片段,最相关的方法是get_data()
file_observational_area * _file_observational_area = NULL;
int main(int argc, char* args[]) {
//pass in as console argument
char* xmlFile = args[1];
//initialize file_observational_area
_file_observational_area = allocate_file_observational_area(_file_observational_area, 1);
//actual data
field_data_value * _field_data_values_array = NULL;
try {
parser->parse(xmlFile);
DOMDocument* dom = parser->getDocument();
DOMNodeList * dom_node_list = dom->getChildNodes();
for (unsigned int i = 0; i < dom_node_list->getLength(); i++) {
walk_DOM(dom_node_list->item(i), _file_observational_area);
}
get_data(_file_observational_area, xmlFile, 0, 0, 0, _field_data_values_array);
} catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
}walk_dom()相关片段,它调用parse_dom():
void walk_DOM(DOMNode * dom_node, file_observational_area * _file_observational_area) {
if (_file_observational_area) {
_file_observational_area = parse_dom(dom_node, _file_observational_area);
}parse_dom()函数相关片段:
/*<Field_Delimited>*/
if (XMLString::equals(currentElement->getNodeName(), XMLString::transcode("Field_Delimited"))) {
/*<Field_Delimited>
<name>enc4</name>
<data_type>ASCII_Real</data_type>
<unit>rad</unit>
<description>Joint 4 encoder counts [RA_DOF]</description>
</Field_Delimited>*/
/*<Field_Delimited>*/
XMLCh* tag_Field_Delimited_name = XMLString::transcode("name");
string tag_Field_Delimited_name_val;
XMLCh* tag_Field_Delimited_data_type = XMLString::transcode("data_type");
string tag_Field_Delimited_data_type_val;
XMLCh* tag_Field_Delimited_unit = XMLString::transcode("unit");
string tag_Field_Delimited_unit_val;
XMLCh* tag_Field_Delimited_description = XMLString::transcode("description");
string tag_Field_Delimited_description_val;
DOMElement * field_delimited_element = NULL;
cout << "<Field_Delimited> DETECTED\n";
DOMNode * child = currentElement->getFirstElementChild();
while (NULL != child) {
if (DOMNode::ELEMENT_NODE == child->getNodeType()) {
if (XMLString::equals(tag_Field_Delimited_name, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());
//strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_name_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name << "\n";
}
if (XMLString::equals(tag_Field_Delimited_data_type, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type = XMLString::transcode(child->getTextContent());
//strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_data_type_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type << "\n";
}
if (XMLString::equals(tag_Field_Delimited_unit, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit = XMLString::transcode(child->getTextContent());
// strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_unit_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit << "\n";
}
if (XMLString::equals(tag_Field_Delimited_description, child->getNodeName())) {
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description = XMLString::transcode(child->getTextContent());
//strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description, XMLString::transcode(child->getTextContent()));
cout << "Debug: tag_Field_Delimited_description_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description << "\n";
}
}
child = child->getNextSibling();
}//end while <Field_Delimited> has siblings
}//end /*<Field_Delimited>*/
}日志显示了 parse_dom() 的预期行为,我可以通过 XMLString::transcode(child->getTextContent()) &来获得正确的值,使用 _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());设置值。
问题所在:然而,在void get_data()**,中,char的值丢失或损坏,请参阅相关片段**:
for (int field_record_index = 0; field_record_index < _file_observational_area->_table_delimited->_record_delimited->fields; field_record_index++) {
if (NULL != _file_observational_area->_table_delimited->_record_delimited->_field_delimited) {
cout << "<Field_Delimited> number:" << field_record_index << "\n";
//MISSING or corrupted name
cout << "name :" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].name << "\n";
//MISSING or corrupted datatype
cout << "data_type:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].data_type << "\n";
//MISSING or corrupted unit
cout << "unit:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].unit << "\n";
//MISSING or corrupted description
cout << "description:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].description << "\n";
}这就是我为动态字符串分配内存的方式:
/*=============================================================================
Function malloc_field_delimited
Description: allocated memory for _record_delimited->_field_delimited
* dynamic array
References:
Inputs:
Output:
==========================================================*/
field_delimited * malloc_field_delimited(field_delimited * _field_delimited, int number_of_fields) {
_field_delimited = (field_delimited*) malloc(sizeof (field_delimited) * number_of_fields);
field_delimited * field_delimited_ptr = _field_delimited;
if (_field_delimited) {
for (int i = 0; i < number_of_fields; i++) {
(field_delimited_ptr + i)->name = (char *) malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->data_type = (char *) malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->description = (char *) malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->unit = (char *) malloc(sizeof (char) * 256);
}
} else {
printf("malloc_field_delimited(), unable to allocate memory, exiting!");
exit(1);
}
return _field_delimited;
}我也尝试使用memset(),但是它是无用的,同样的问题。
为什么get_data()中的char值丢失&我如何解决这个问题?
我想坚持通过char *使用动态分配的字符串,而不是使用字符串。
多谢百万!
发布于 2020-02-05 07:43:09
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());您正在重写您的指针,丢失以前分配的内存。您应该使用strcpy代替。
strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name, XMLString::transcode(child->getTextContent()));https://stackoverflow.com/questions/60068337
复制相似问题