28
28
#include < vector> // because its based on windows 8 build :P
29
29
30
30
#include " platform/CCFileUtils.h"
31
- #include " tinyxml2.h"
32
31
#include " rapidxml/rapidxml_sax3.hpp"
33
32
34
33
NS_CC_BEGIN
35
34
36
- class XmlSaxHander : public tinyxml2 ::XMLVisitor
37
- {
38
- public:
39
- XmlSaxHander ():_ccsaxParserImp(0 ){};
40
-
41
- virtual bool VisitEnter ( const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* firstAttribute );
42
- virtual bool VisitExit ( const tinyxml2::XMLElement& element );
43
- virtual bool Visit ( const tinyxml2::XMLText& text );
44
- virtual bool Visit ( const tinyxml2::XMLUnknown&){ return true ; }
45
-
46
- void setSAXParserImp (SAXParser* parser)
47
- {
48
- _ccsaxParserImp = parser;
49
- }
50
-
51
- private:
52
- SAXParser *_ccsaxParserImp;
53
- };
54
-
55
-
56
- bool XmlSaxHander::VisitEnter ( const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* firstAttribute )
57
- {
58
- // log(" VisitEnter %s",element.Value());
59
-
60
- std::vector<const char *> attsVector;
61
- for ( const tinyxml2::XMLAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next () )
62
- {
63
- // log("%s", attrib->Name());
64
- attsVector.push_back (attrib->Name ());
65
- // log("%s",attrib->Value());
66
- attsVector.push_back (attrib->Value ());
67
- }
68
-
69
- // nullptr is used in c++11
70
- // attsVector.push_back(nullptr);
71
- attsVector.push_back (nullptr );
72
-
73
- SAXParser::startElement (_ccsaxParserImp, (const CC_XML_CHAR *)element.Value (), (const CC_XML_CHAR **)(&attsVector[0 ]));
74
- return true ;
75
- }
76
- bool XmlSaxHander::VisitExit ( const tinyxml2::XMLElement& element )
77
- {
78
- // log("VisitExit %s",element.Value());
79
-
80
- SAXParser::endElement (_ccsaxParserImp, (const CC_XML_CHAR *)element.Value ());
81
- return true ;
82
- }
83
-
84
- bool XmlSaxHander::Visit ( const tinyxml2::XMLText& text )
85
- {
86
- // log("Visit %s",text.Value());
87
- SAXParser::textHandler (_ccsaxParserImp, (const CC_XML_CHAR *)text.Value (), strlen (text.Value ()));
88
- return true ;
89
- }
90
-
91
35
// / rapidxml SAX handler
92
36
class RapidXmlSaxHander : public rapidxml ::xml_sax2_handler
93
37
{
@@ -136,12 +80,11 @@ bool SAXParser::init(const char* /*encoding*/)
136
80
137
81
bool SAXParser::parse (const char * xmlData, size_t dataLength)
138
82
{
139
- tinyxml2::XMLDocument tinyDoc;
140
- tinyDoc.Parse (xmlData, dataLength);
141
- XmlSaxHander printer;
142
- printer.setSAXParserImp (this );
143
-
144
- return tinyDoc.Accept ( &printer );
83
+ if (xmlData != nullptr && dataLength > 0 ) {
84
+ std::string mutableData (xmlData, dataLength);
85
+ return this ->parseIntrusive (&mutableData.front (), dataLength);
86
+ }
87
+ return false ;
145
88
}
146
89
147
90
bool SAXParser::parse (const std::string& filename)
@@ -150,7 +93,7 @@ bool SAXParser::parse(const std::string& filename)
150
93
Data data = FileUtils::getInstance ()->getDataFromFile (filename);
151
94
if (!data.isNull ())
152
95
{
153
- ret = parse (( const char *)data.getBytes (), data.getSize ());
96
+ ret = parseIntrusive (( char *)data.getBytes (), data.getSize ());
154
97
}
155
98
156
99
return ret;
0 commit comments