c++ - 当我打印到屏幕或文件时,Expat 打印出垃圾

标签 c++ xml expat-parser

当我从我的 XML 文档中打印出信息时,我在每一行之前得到了 ��。 这是我的 XML 文档。

<?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 的行的末尾为 '\n' 调用字符。信息字符串中的 '\n' 之后的其他字符都是垃圾。

关于c++ - 当我打印到屏幕或文件时,Expat 打印出垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15053583/

相关文章:

xml - 如何将 XML 插入现有 XML 节点

c++ - 在递归互斥体和更复杂的类之间进行权衡?

c++ - 在指针中存储无符号整数

java - 在模拟器中打开时 Android 代码崩溃

c++ - 在 C++ 中使用 Expat XML 解析器丢失 CDATA 中转义符号周围的空格

c++ - 64 位 libjingle 无法解析登录 XML 并出现 expat 错误 : ERROR_INVALID_TOKEN

xml - 为什么外籍人士拒绝破折号字符无效?

c++ - 为结构变量创建 vector<type> 类型的对象

c++ - 计算间隔内值数量的更有效方法?

xml - 什么是 XML 的良好替代数据格式?