Toon posts:

[C++/XML] Xerces C++ XMLString problemen/vragen

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:

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.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
De delete[] van beide tempStrings ontbreekt in elk geval. Ik weet niet wat xercesc::XMLString::release doet, maar hoort dat niet bij een xerxes allocatie?

Verder heb ik wat twijfels over de for-lus. Wat is er mis met
C++:
1
for( int start = 0; start < len;start += 500 ) ...
?
De toegevoegde waarde van i, counter,end en rest ontgaan me. Volgens mij heb je daardoor nog een bug in het laatste stuk. Dat zou len%500 bytes in de laatste tempstring moeten schrijven, maar die is [len-(len%500)] bytes lang.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
release roept het onderliggend delete[] aan. Dat is dus al geregeld. Verder output ik de start en eind variabelen (die ook voor de subString worden gebruikt) en dat krijg ik wel goed te zien. Bv:

Start: 0 Eind: 500
Value: (500 tekens)
Start: 500 Eind: 1000
Value: leeg

etc.

Ik kan verder ook geen goede voorbeelden vinden waarin een parser helemaal is uitgewerkt (alleen wat print voorbeelden met een speciale XMLFormater die ik verder helemaal niet nodig heb).
Voor elementen met weinig dat leverd de hele parser ook geen problemen, de inhoud daarvan kan wel goed worden getranscode.