Ik ben nu tegen een aantal problemen aangelopen waar ik niet meer uitkom. Ik ben bezig met een XML (SAX) parser in C++ met behulp van Xerces C++ (van Apache) onder linux.
Het probleem doet zich voor in de characters functie (die wordt aangeroepen zodra de inhoud van een element wordt gelezen).
Het XML bestand dat ik gebruik, bevat een aantal elementen, waarvan er 2 groter zijn dan 2000 karakters. Deze zijn Base64 gecodeerd.
Nu de code:
De problemen:
1. Jullie zullen je afvragen waarom ik de inhoud van een element in stukken kopieer en in een string append ipv de hele gedecodeerde string in een keer transcode (omzetten van XMLString type naar std::string) en in de vector plaats. Dit werkt niet, om welke reden is mij ook niet duidelijk, maar blijkbaar kan de transcode functie niet groter dan x aantal bytes transcoden.
2. Als ik de code draai die hierboven staat gebeurt het volgende:
De eerste 500 karakters worden goed getranscode en toegevoegd aan de uiteindelijk string.
De 500 die daarop volgen (500-1000) wordt niet getranscode (output value: is leeg).
De 500 daarop (1000-1500) weer wel.
De 500 daarop (1500-2000) weer niet.
Nu zou ik dus willen weten of iemand ervaring heeft met de Xerces C++ library. De API documentatie is goed verzorgd, maar de voorbeeld code en andere tekst en uitleg op internet is zeer mager.
Ik wil graag weten waarom het transcoden van een gehele XMLString naar een string (langer dan 500 karakters) niet goed gaat EN waarom er om en om stukken uit de XMLString niet goed worden overgenomen.
Het probleem doet zich voor in de characters functie (die wordt aangeroepen zodra de inhoud van een element wordt gelezen).
Het XML bestand dat ik gebruik, bevat een aantal elementen, waarvan er 2 groter zijn dan 2000 karakters. Deze zijn Base64 gecodeerd.
Nu de code:
code:
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
| void SAXParser::characters(const XMLCh* const chars, const unsigned int length) {
unsigned int len = length;
XMLCh* decodeString = new XMLCh[len];
std::string totalString = "";
unsigned int left, counter, amount, rest, start, end;
//eerst decoderen van de inhoud van de element
decodeString = xercesc::Base64::decode(chars, &len);
//kleiner of gelijk aan 500 karakters ? -> meteen transcode naar char*
if(len <= 500) {
totalString = xercesc::XMLString::transcode(decodeString);
left = 0;
} else {
//groter als 500 karakaters, per 500 karakters opsplitsen
left = len;
amount = 500;
counter = left / amount;
rest = left % amount;
for(int i=0; i < counter; i++) {
//blokken van 500
XMLCh* tempString = new XMLCh[amount];
start = (i * amount);
end = (i * amount) + amount;
std::cout << "Nu kopieren: " << start << " - " << end << std::endl;
xercesc::XMLString::subString(tempString, decodeString, start, end);
totalString.append(xercesc::XMLString::transcode(tempString));
std::cout << "value: " << xercesc::XMLString::transcode(tempString) << std::endl;
xercesc::XMLString::release(&tempString);
}
//rest
XMLCh* tempString = new XMLCh[len - rest];
xercesc::XMLString::subString(tempString, decodeString, len - rest, len);
totalString.append(xercesc::XMLString::transcode(tempString)); //aan totale string toevoegen
xercesc::XMLString::release(&tempString); //tijdelijke string vrijgeven
}
this->string_arr->push_back(totalString); //gedecodeerde inhoud van het element
//in vector plaatsen
xercesc::XMLString::release(&decodeString); //gedecodeerde string vrijgeven
} |
De problemen:
1. Jullie zullen je afvragen waarom ik de inhoud van een element in stukken kopieer en in een string append ipv de hele gedecodeerde string in een keer transcode (omzetten van XMLString type naar std::string) en in de vector plaats. Dit werkt niet, om welke reden is mij ook niet duidelijk, maar blijkbaar kan de transcode functie niet groter dan x aantal bytes transcoden.
2. Als ik de code draai die hierboven staat gebeurt het volgende:
De eerste 500 karakters worden goed getranscode en toegevoegd aan de uiteindelijk string.
De 500 die daarop volgen (500-1000) wordt niet getranscode (output value: is leeg).
De 500 daarop (1000-1500) weer wel.
De 500 daarop (1500-2000) weer niet.
Nu zou ik dus willen weten of iemand ervaring heeft met de Xerces C++ library. De API documentatie is goed verzorgd, maar de voorbeeld code en andere tekst en uitleg op internet is zeer mager.
Ik wil graag weten waarom het transcoden van een gehele XMLString naar een string (langer dan 500 karakters) niet goed gaat EN waarom er om en om stukken uit de XMLString niet goed worden overgenomen.