2013-02-24 80 views
0

当我从我的XML文档打印出信息时,我在每行之前得到了 。 这是我的XML文档。当我打印到屏幕或文件时,Expat打印出垃圾

<?xml version="1.0" encoding="ISO-8859-1"?> 
<note> 
<to>Tove</to> 
<from>Jani</from> 
<heading>Reminder</heading> 
<body>Don't forget me this weekend!</body> 
</note> 

这里是我的代码

#include <cstdio> 
#include <expat.h> 
#include <string> 
#include <fstream> 
#include <cstring> 
using namespace std; 
void XMLCALL start(void*,const char*, const char**); 
void XMLCALL end(void*,const char*); 
void XMLCALL character(void*, const char*, int); 
int main() 
{ 
    int size; 
    fstream fin("note.xml", ios::in | ios::binary | ios::ate); 
    size = fin.tellg(); 
    char* data = new char [size + 1]; 
    fin.seekg(0, ios::beg); 
    XML_Parser parser = XML_ParserCreate("ISO-8859-1"); 
    XML_SetElementHandler(parser, start, end); 
    XML_SetCharacterDataHandler(parser, character); 
    fin.read(data, size); 
    XML_Parse(parser, data, size , fin.eof()); 
    XML_ParserFree(parser); 
    fin.close(); 
    delete [] data; 
} 

void XMLCALL start(void* data, const char* name, const char** atts) 
{ 
    if((strcmp(name, "note")) == 0) 
    { 
     printf("-- Note --<br> "); 
    } 
    else if((strcmp(name,"to")) == 0) 
    { 
     printf("To: "); 
    } 
    else if((strcmp(name,"from")) == 0) 
    { 
     printf("From: "); 
    } 
    else if((strcmp(name,"heading")) == 0) 
    { 
     printf("Heading: "); 
    } 
    else if((strcmp(name, "body")) == 0) 
    { 
     printf("Message: "); 
    } 
} 

void XMLCALL end(void* data,const char* name) 
{ 
    printf("<br>"); 
} 

void XMLCALL character(void* data, const char* info, int length) 
{ 
    printf("%s",info); 
} 

这是它打印出:

-- Note --<br> 
�To: Tove<br> 
xFrom: Jani<br> 
xHeading: Reminder<br> 
xMessage: Don't forget me this weekend!<br> 
x<br> 

这是我希望它打印出的内容:

-- Note --<br> 
To: Tove<br> 
From: Jani<br> 
Heading: Reminder<br> 
Message: Don't forget me this weekend!<br> 
<br> 

任何援助将不胜感激。 谢谢

+1

换行符?即''\ r \ n“'? – 2013-02-24 16:03:35

+0

可能是Unicode BOM标头。顺便说一句,你应该更好地使用strncmp来比较字符串。使用此命令生成许多严重错误。 – rekire 2013-02-24 16:06:09

+1

@rekire:等等,什么?这对我来说没有意义。这就像“不要使用mmap,它是危险的和邪恶的!” – thejh 2013-02-24 16:13:14

回答

1

字符在长度= 1的行的末尾被称为'\ n'。其他字符在信息字符串中的'\ n'后面是垃圾。

+0

因此,每个元素都必须调用字符? – OshaMan 2013-02-24 17:06:03

+0

好的,我修好了。谢谢。 – OshaMan 2013-02-24 17:21:36

+0

我使用了一个字符串getline()和一个while循环来解析每个元素。 – OshaMan 2013-02-24 17:23:05