From 690baf641ab2b026ca6d715eb3e81dff8b166d4f Mon Sep 17 00:00:00 2001 From: Myun2 Date: Sun, 10 Oct 2010 18:11:08 +0900 Subject: [PATCH] roast_xml/sax_generator.hpp: 101001_rax\1\sax_generator.hpp --- .../include/roast/xml/roast_xml/sax_generator.hpp | 23 +++++++++++++++++----- roast/test/lexical_test/roast_test_2nc.vcproj | 2 +- roast/test/lexical_test/sax_test.cpp | 3 ++- roast/test/lexical_test/temp.xml | 3 +-- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/roast/include/roast/xml/roast_xml/sax_generator.hpp b/roast/include/roast/xml/roast_xml/sax_generator.hpp index 2c0a09f9..123f8cf9 100644 --- a/roast/include/roast/xml/roast_xml/sax_generator.hpp +++ b/roast/include/roast/xml/roast_xml/sax_generator.hpp @@ -25,6 +25,7 @@ namespace roast virtual bool text( const sized_ccharbuf &s ){ return true; } virtual bool start_element( const sized_ccharbuf &s ){ return true; } virtual bool end_element(){ return true; } + virtual bool end_element( const sized_ccharbuf &s ){ return true; } }; class _rax_select_element : public _rax_select_base @@ -50,11 +51,16 @@ namespace roast private: ::std::vector<_rax_select_base*> m_list; size_t m_index; + bool m_valid_elem; inline _rax_select_base* _cur(){ return m_list[m_index]; } - inline bool _valid(){ return m_index < m_list.size(); } + //inline bool _valid(){ return m_index < m_list.size(); } + inline bool _valid(){ return m_index < m_list.size() && m_valid_elem; } public: - rax_doc(){ m_index = 0; } + rax_doc(){ + m_index = 0; + m_valid_elem = true; + } virtual ~rax_doc(){ for(size_t i=0; i*)this; } - sax_impl_& operator / (_rax_select_base& functr) { + template + sax_impl_& operator / (_Functor& functr) { //m_list.push_back(&functr); - m_list.push_back(new _rax_select_base(functr)); + m_list.push_back(new _Functor(functr)); return *(sax_impl_*)this; } ////////////////////////////////////////////////////////// void start_element( const sized_ccharbuf &s ){ if ( m_index < m_list.size() ) - _cur()->start_element(s); + m_valid_elem = _cur()->start_element(s); + else + m_valid_elem = false; m_index++; } void start_xml_declaration(){} @@ -85,6 +94,10 @@ namespace roast void end_element(){ m_index--; } + void end_element( const sized_ccharbuf &s ){ + m_index--; + if(_valid()) _cur()->end_element(s); + } }; static sax_impl_ rax; diff --git a/roast/test/lexical_test/roast_test_2nc.vcproj b/roast/test/lexical_test/roast_test_2nc.vcproj index a421defd..8f9ccc3a 100644 --- a/roast/test/lexical_test/roast_test_2nc.vcproj +++ b/roast/test/lexical_test/roast_test_2nc.vcproj @@ -175,7 +175,7 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > diff --git a/roast/test/lexical_test/sax_test.cpp b/roast/test/lexical_test/sax_test.cpp index a67bfde7..60981c76 100644 --- a/roast/test/lexical_test/sax_test.cpp +++ b/roast/test/lexical_test/sax_test.cpp @@ -52,7 +52,7 @@ int main() //printf(work); sax_parser saxpar; - saxpar.analyze((const char*)work, + saxpar.analyze(work, rax / "hoge" / text2str(s) ); @@ -65,6 +65,7 @@ int main() );*/ //saxgen /"statuses"/"status"/ ( el("!user")/status_append_o || el("user")/user ) ); //saxgen / el("statuses") / el("status") / ( ); + printf("%s\n", s.c_str()); } /*catch(...) { diff --git a/roast/test/lexical_test/temp.xml b/roast/test/lexical_test/temp.xml index ac956512..fe389efb 100644 --- a/roast/test/lexical_test/temp.xml +++ b/roast/test/lexical_test/temp.xml @@ -7,5 +7,4 @@ version encoding = "UTF-8" ?> - - \ No newline at end of file +bbbb \ No newline at end of file -- 2.11.0