source: trunk/gsdl/src/colservr/expat_document.cpp@ 9216

Last change on this file since 9216 was 9216, checked in by kjdon, 19 years ago

a few changes to make it compile on windows - changed the text_t inside the resultpack to text_t*

  • Property svn:keywords set to Author Date Id Revision
File size: 2.5 KB
Line 
1#include <string.h>
2#include <expat.h>
3
4#if defined(GSDL_USE_OBJECTSPACE)
5# include <ospace\std\iostream>
6#elif defined(GSDL_USE_IOS_H)
7# include <iostream.h>
8#else
9# include <iostream>
10using namespace std;
11#endif
12
13#include "queryinfo.h"
14
15#include "expat_document.h"
16
17#include "text_t.h"
18#include "fileutil.h"
19#include "expat_resultset.h"
20
21struct resultpack {
22 text_t *current_text;
23 text_t *section_num;
24 text_t *section_level;
25 bool store_text;
26};
27
28static void XMLCALL
29startElement(void *userData, const char *name, const char **attributes)
30{
31 resultpack * rpack_ptr = (resultpack*)userData;
32 text_t element_name = (char*)name;
33 if (element_name == *(rpack_ptr->section_level)) {
34 text_t id_att = (char *)get_attribute(attributes,"gs2:id");
35 if (id_att == *(rpack_ptr->section_num)) {
36 rpack_ptr->store_text = true;
37 }
38
39 }
40}
41
42static void XMLCALL
43endElement(void *userData, const char *name)
44{
45 resultpack * rpack_ptr = (resultpack*)userData;
46 text_t element_name = (char*)name;
47 if (element_name == *(rpack_ptr->section_level)) {
48 if (rpack_ptr->store_text == true) {
49 // we have finished now, can we quit this??
50 rpack_ptr->store_text = false;
51 }
52 }
53
54}
55
56static void XMLCALL
57characterData(void *userData, const char * text, int len) {
58 resultpack * rpack_ptr = (resultpack*)userData;
59 if (rpack_ptr->store_text) {
60 rpack_ptr->current_text->appendcarr(text, len);
61 }
62}
63int expat_document(const text_t &filename, const text_t &sec_level, const text_t &sec_num, text_t & doc_content){
64
65 text_t current_text;
66 current_text.clear();
67 text_t section_num = sec_num;
68 text_t section_level = sec_level;
69
70
71 resultpack rpack = { &current_text, &section_num, &section_level, false};
72 //cerr << "sec num = "<<sec_num<<", sec level="<<sec_level<<", filename="<<filename<<endl;
73 text_t doc_text;
74 read_file(filename, doc_text);
75
76
77 char * c_doc_text = doc_text.getcstr();
78 XML_Parser parser = XML_ParserCreate(NULL);
79
80 XML_SetUserData(parser, &rpack);
81 XML_SetElementHandler(parser, startElement, endElement);
82 XML_SetCharacterDataHandler(parser, characterData);
83 int return_status = 0;
84 const int parse_status
85 = XML_Parse(parser, c_doc_text, strlen(c_doc_text), XML_TRUE);
86
87 if (parse_status == XML_STATUS_ERROR) {
88 fprintf(stderr,
89 "%s at line %d\n",
90 XML_ErrorString(XML_GetErrorCode(parser)),
91 XML_GetCurrentLineNumber(parser));
92 return_status = 1;
93 }
94
95 XML_ParserFree(parser);
96 free(c_doc_text);
97 doc_content.clear();
98 doc_content.append(current_text);
99 return return_status;
100}
101
102
Note: See TracBrowser for help on using the repository browser.