From 20fcbc2a024e74a856efe81029b4f3f014503599 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 31 Aug 2020 19:09:12 +0800 Subject: [PATCH] to advance xml::ElementParseCreater --- inc/hgl/util/xml/ElementParseCreater.h | 12 +++++++---- src/xml/ElementParseCreater.cpp | 29 ++++++++++++++++++++------ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/inc/hgl/util/xml/ElementParseCreater.h b/inc/hgl/util/xml/ElementParseCreater.h index 0bc23fd..fa4253f 100644 --- a/inc/hgl/util/xml/ElementParseCreater.h +++ b/inc/hgl/util/xml/ElementParseCreater.h @@ -47,20 +47,24 @@ namespace hgl class ElementParseCreater:public ElementParse { Stack ecs_stack; + + Map ecs_map; - ElementCreater *root_ec; ElementCreater *cur_ec; public: - ElementParseCreater(ElementCreater *rec) + ElementParseCreater(ElementCreater *root_ec) { - root_ec=rec; - cur_ec=rec; + cur_ec=nullptr; + + Registry(root_ec); } virtual ~ElementParseCreater()=default; + bool Registry (ElementCreater *ec); + public: bool Start (const u8char *element_name) override; diff --git a/src/xml/ElementParseCreater.cpp b/src/xml/ElementParseCreater.cpp index 3bc088c..45c33e6 100644 --- a/src/xml/ElementParseCreater.cpp +++ b/src/xml/ElementParseCreater.cpp @@ -4,17 +4,34 @@ namespace hgl { namespace xml { + bool ElementParseCreater::Registry(ElementCreater *ec) + { + if(!ec)return(false); + + return ecs_map.Add(ec->GetElementName(),ec); + } + bool ElementParseCreater::Start (const u8char *element_name) { if(!element_name||!*element_name)return(false); - if(!cur_ec) - return(false); + ElementCreater *ec=nullptr; - ElementCreater *ec=cur_ec->GetSubElementCreater(element_name); - ecs_stack.Push(cur_ec); - - cur_ec=nullptr; + if(ecs_stack.GetCount()==0) //根 + { + if(!ecs_map.Get(element_name,ec)) + return(false); + } + else + { + if(!cur_ec) + return(false); + + ec=cur_ec->GetSubElementCreater(element_name); + ecs_stack.Push(cur_ec); + } + + cur_ec=nullptr; if(ec) {