1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#include "saxparser.h"
#include <sstream>
#include <iostream>
#include <hugin.hpp>
SAXParser::SAXParser()
{
parser = XML_ParserCreate(nullptr);
if(!parser)
{
ERR(sax, "Couldn't allocate memory for parser\n");
return;
}
XML_SetUserData(parser, this);
XML_UseParserAsHandlerArg(parser);
XML_SetElementHandler(parser, SAXParser::startHandler, SAXParser::endHandler);
XML_SetCharacterDataHandler(parser, SAXParser::characterHandler);
}
SAXParser::~SAXParser()
{
XML_ParserFree(parser);
}
int SAXParser::parseFile(const std::string& filename)
{
if(filename.empty())
{
return 0;
}
std::ifstream file(filename, std::ifstream::in);
if(!file.is_open())
{
return 1;
}
std::stringstream ss;
ss << file.rdbuf();
std::string str = ss.str();
return parseString(str, filename);
}
int SAXParser::parseString(const std::string& str,
const std::string& xml_source_name)
{
DEBUG(sax, "parse(buffer %d bytes)\n", (int)str.length());
if(!XML_Parse(parser, str.c_str(), str.length(), true))
{
parseError(str, XML_ErrorString(XML_GetErrorCode(parser)),
xml_source_name, (int)XML_GetCurrentLineNumber(parser));
return 1;
}
return 0;
}
void SAXParser::parseError(const std::string& buf, const std::string& error,
const std::string& xml_source_name,
std::size_t lineno)
{
std::cerr << "SAXParser error trying to parse from source: " <<
xml_source_name << "\n";
std::cerr << "At line " << lineno << ": " << error << "\n";
std::cerr << "Buffer " << buf.size() << " bytes: \n[\n";
std::cerr << buf;
std::cerr << "\n]" << std::endl;
}
void SAXParser::characterHandler(void* parser, const XML_Char* cData, int len)
{
SAXParser* sax_parser = (SAXParser*)XML_GetUserData(parser);
std::string chars(cData, len);
sax_parser->characterData(chars);
}
void SAXParser::startHandler(void* parser, const char* el, const char** attr)
{
SAXParser* sax_parser = (SAXParser*)XML_GetUserData(parser);
attr_t attributes;
while(*attr)
{
std::string at_name = *attr++;
std::string at_value = *attr++;
attributes.emplace(at_name, at_value);
}
sax_parser->startTag(std::string(el), attributes);
}
void SAXParser::endHandler(void* parser, const char* el)
{
SAXParser* sax_parser = (SAXParser*)XML_GetUserData(parser);
sax_parser->endTag(std::string(el));
}
|