[C++ | TinyXML] Śmieci w pliku

0

Witam.

Używam parsera XML TinyXML, biblioteczki pod CodeBlocks.

Po wykonaniu takiego kawałka kodu :

    // Make xml: <?xml ..><Hello>World</Hello>
    TiXmlDocument doc;
    TiXmlDeclaration * decl;
    decl = NULL;
    decl = new TiXmlDeclaration("1.0", "", "");
    TiXmlElement * element;
    element = NULL;
    element = new TiXmlElement("Hellow");
    TiXmlText * text;
    text = NULL;
    text = new TiXmlText("World");
    element->LinkEndChild(text);
    doc.LinkEndChild(decl);
    doc.LinkEndChild(element);


    doc.SaveFile("madeByHand.xml");

Plik XML powinien wyglądać tak :

<?xml version="1.0" ?>
<Hello>World</Hello>

A wygląda tak :

<?xml version="1.0" ?>
<Hellow>World&#x00;&#x00;&#x00;&#x02;&#x00;&#x02;&#x00;‘&#x01;&#x08;&#x00;É7&gt;&#x00;&#x00;&#x00;&#x00;&#x00;&#x09;&#x00;&#x02;&#x00;—&#x01;&#x0C;&#x00;&lt;&#x00;&#x00;&#x00;pćA&#x00;ŕ«A&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;˙˙˙˙&#x00;&#x00;&#x00;&#x00;|ý&quot;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;&#x00;˙˙˙˙&#x00;&#x00;&#x00;&#x00;&#x0C;&#x00;&#x09;&#x00;ž</Hellow>

Pojęcia nie mam skąd się wzięły te wszystkie znaczki.

Myślałem, że to jakaś pozostałość po wskaźnikach tworzonych w funkcji, więc próbowałem je zerowaći usuwać :

    decl = NULL;
    element = NULL;
    text = NULL;
    delete decl;
    delete element;
    delete text;

Ale niestety nie pomogło.

Będę wdzięczny za wszelkie wskazówki.

Pozdrawiam.

PS. Kod jest ze strony projektu TinyXML więc powinien działać poprawnie.

0

Wygląda na to, że TiXmlText ignoruje znak końca łańcucha, nie wiedzieć czemu :/ Spróbuj tak:
TiXmlText(string("World"));

0

Niestety, kompilator wywala błąd :

main.cpp: In function `void write_simple_doc()':
main.cpp:22: error: no matching function for call to `TiXmlText::TiXmlText(std::string)'
F:/_develope/CodeBlocks/include/tinyxml.h:1010: note: candidates are: TiXmlText::TiXmlText(const TiXmlText&)
F:/_develope/CodeBlocks/include/tinyxml.h:996: note:                 TiXmlText::TiXmlText(const char*)
0

co ciekawe, znak konca lancucha tam jest :
<Hellow>World�
x00 to nic innego jak EOS.. dziwne, na prawde.. jesli on czyta bez oporow z podanego wskaznika, to czemu w ogole przestal? jak nie zareagowal na x00 (eos-ansi), ani x00x00 (eos-unicode), to co w ogole spowodowalo ze w koncu przestal czytac i wypisal </hellow>.. mzoe jakos nalezy dlugosc tekstu tez przekazac/ustawic..?

0

Dodam, że na VC i tinyXML v2.5.3 działa bez zarzutu.

Tu masz fragment kodu, który robi ten śmietnik - ustaw breakpointa i zobacz co tam się dzieje.

void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString )
{

	while( i<(int)str.length() ) //<--- zapewne tu za dużo zwraca :P
	{
		unsigned char c = (unsigned char) str[i];

                ...

		else if ( c < 32 )
		{
			char buf[ 32 ];
			
			#if defined(TIXML_SNPRINTF)		
				TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) );
			#else
				sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) );
			#endif		

			outString->append( buf, (int)strlen( buf ) );
			++i;
		}
            ...
0

Oj za mało czytałeś dokumentacji, ja jakoś cała klasę pod swój projekt zrobiłem, i nie miałem najmniejszych problemów. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1