diff --git a/MainWidget.cpp b/MainWidget.cpp index 9e54a2a..2ade3d9 100644 --- a/MainWidget.cpp +++ b/MainWidget.cpp @@ -29,6 +29,10 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget ui->btnSave->setEnabled(false); ui->edAllPage->setEnabled(false); ui->cbCaseSensitive->setChecked(false); + ui->btnImport->setEnabled(false); + ui->btnExport->setEnabled(false); + ui->btnBackup->setEnabled(false); + ui->cbRepOnlySelect->setChecked(true); ui->btnRead->setFixedWidth(100); ui->btnSave->setFixedWidth(100); ui->btnExit->setFixedWidth(100); @@ -265,6 +269,9 @@ void MainWidget::read(const QString& file_path) ui->btnRead->setEnabled(false); ui->btnSave->setEnabled(true); ui->btnSelectFile->setEnabled(false); + ui->btnImport->setEnabled(true); + ui->btnExport->setEnabled(true); + ui->btnBackup->setEnabled(true); } void MainWidget::search() diff --git a/src/data_edit.cpp b/src/data_edit.cpp index 8505098..fc1bc16 100644 --- a/src/data_edit.cpp +++ b/src/data_edit.cpp @@ -51,18 +51,26 @@ void CDataEdit::import_data() } std::vector valid_data{}; - QStringList list = data.trimmed().split("\n"); + QStringList list = data.trimmed().split("\n"); for (int i = 0; i < list.size(); ++i) { const QString& item = list[i]; if (item.trimmed().isEmpty()) { continue; } - if (xml_opr_->check_same_struct (item.toStdString())) { + if (xml_opr_->check_same_struct(item.toStdString())) { CUtil::msg(this, u8"不是合法的xml语句或者与现有结构不一致。"); return; } valid_data.push_back(item.toStdString()); } + auto task_count = valid_data.size(); + std::size_t success_count{}; + if (!xml_opr_->import_newer_data(valid_data, success_count)) { + CUtil::msg(this, u8"导入失败。"); + return; + } + QString info = QString(u8"需要导入 %1 条数据,成功导入 %2 条。").arg(task_count).arg(success_count); + CUtil::msg(this, info); } void CDataEdit::showEvent(QShowEvent* event) diff --git a/src/xml_opr.cpp b/src/xml_opr.cpp index b3770a3..411d90f 100644 --- a/src/xml_opr.cpp +++ b/src/xml_opr.cpp @@ -127,7 +127,7 @@ bool CXmlOpr::check_same_struct(const std::string& data) return false; } const auto* attribute = own_ele->FirstAttribute(); - int own_cnt = 0; + int own_cnt = 0; while (attribute) { ++own_cnt; if (import_ele->FindAttribute(attribute->Name()) == nullptr) { @@ -137,7 +137,7 @@ bool CXmlOpr::check_same_struct(const std::string& data) } const auto* attr_import = import_ele->FirstAttribute(); - int import_cnt = 0; + int import_cnt = 0; while (attr_import) { ++import_cnt; attr_import = attr_import->Next(); @@ -150,10 +150,27 @@ bool CXmlOpr::check_same_struct(const std::string& data) return true; } -bool CXmlOpr::import_newer_data(const std::vector& vec) +// Warning: 不检查 xml 格式合法性,请自行调用 check_valid_xml_data +// 且导入前每条数据请自行使用 check_same_struct 检测。 +bool CXmlOpr::import_newer_data(const std::vector& vec, std::size_t success_count) { - - return false; + success_count = 0; + auto* last_item = parent_node_->LastChildElement(opr_base_.the_node.c_str()); + if (last_item == nullptr) { + return false; + } + for (const auto& data : vec) { + tinyxml2::XMLDocument doc; + doc.Parse(data.c_str()); + auto* item = doc.FirstChildElement(opr_base_.the_node.c_str()); + if (item == nullptr) { + continue; + } + ++success_count; + auto* nitem = copy_element(item); + insert_brother_node(last_item, nitem); + } + return true; } void CXmlOpr::del_element(Element_t* ele) diff --git a/src/xml_opr.h b/src/xml_opr.h index 04b890d..915db9f 100644 --- a/src/xml_opr.h +++ b/src/xml_opr.h @@ -37,7 +37,7 @@ public: // 不检查 xml 格式合法性,请自行调用 check_valid_xml_data bool check_same_struct(const std::string& data); // 不检查 xml 格式合法性,请自行调用 check_valid_xml_data - bool import_newer_data(const std::vector& vec); + bool import_newer_data(const std::vector& vec, std::size_t success_count); public: void get_key_value(Element_t* ele, Property_t& vec);