diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index 1a0da06f65..74b4fbc0f5 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -1900,18 +1900,19 @@ int FileStorage::getFormat() const FileNode FileStorage::operator [](const char* key) const { - if( p->roots.empty() ) - return FileNode(); - - return p->roots[0][key]; + return this->operator[](std::string(key)); } FileNode FileStorage::operator [](const std::string& key) const { - if( p->roots.empty() ) - return FileNode(); - - return p->roots[0][key]; + FileNode res; + for (size_t i = 0; i < p->roots.size(); i++) + { + res = p->roots[i][key]; + if (!res.empty()) + break; + } + return res; } String FileStorage::releaseAndGetString() diff --git a/modules/core/src/persistence_yml.cpp b/modules/core/src/persistence_yml.cpp index 49f4d01841..7742e82770 100644 --- a/modules/core/src/persistence_yml.cpp +++ b/modules/core/src/persistence_yml.cpp @@ -770,7 +770,7 @@ public: bool first = true; bool ok = true; FileNode root_collection(fs->getFS(), 0, 0); - FileNode root_node = fs->addNode(root_collection, std::string(), FileNode::NONE); + for(;;) { // 0. skip leading comments and directives and ... @@ -821,6 +821,7 @@ public: if( memcmp( ptr, "...", 3 ) != 0 ) { // 2. parse the collection + FileNode root_node = fs->addNode(root_collection, std::string(), FileNode::NONE); ptr = parseValue( ptr, root_node, 0, false ); if( !root_node.isMap() && !root_node.isSeq() ) diff --git a/modules/core/test/test_io.cpp b/modules/core/test/test_io.cpp index 0f9b0218b8..d752c1957a 100644 --- a/modules/core/test/test_io.cpp +++ b/modules/core/test/test_io.cpp @@ -1654,9 +1654,19 @@ TEST(Core_InputOutput, FileStorage_YAML_parse_multiple_documents) fs.release(); fs.open(filename, FileStorage::READ); - ASSERT_EQ(42, (int)fs["a"]); - ASSERT_EQ(1988, (int)fs["b"]); + + EXPECT_EQ(42, (int)fs["a"]); + EXPECT_EQ(1988, (int)fs["b"]); + + EXPECT_EQ(42, (int)fs.root(0)["a"]); + EXPECT_TRUE(fs.root(0)["b"].empty()); + + EXPECT_TRUE(fs.root(1)["a"].empty()); + EXPECT_EQ(1988, (int)fs.root(1)["b"]); + fs.release(); + + ASSERT_EQ(0, std::remove(filename.c_str())); } }} // namespace