C++ TinyXML和标签和格式问题

C++ TinyXML和标签和格式问题,c++,xml,tinyxml,C++,Xml,Tinyxml,TinyXML有一个无法修复的问题。我用C++扩展了MFC应用程序的工作。应用程序进行自动测试。完成后,它将所有数据保存在一个XML文件中。下面是我的DOM树的开头 亚历克斯 12345 问题是该库似乎在12345之后添加了一个随机换行符。应该是: 12345 你能帮我吗?我什么都试过了。。。下面是代码片段。另外,在关闭新元素的标记之前,即在 ?? //代码从这里开始 TiXmlDocument文档; TiXmlDeclaration*decl=新的TiXmlDeclaration(“1

TinyXML有一个无法修复的问题。我用C++扩展了MFC应用程序的工作。应用程序进行自动测试。完成后,它将所有数据保存在一个XML文件中。下面是我的DOM树的开头


亚历克斯
12345
问题是该库似乎在12345之后添加了一个随机换行符。应该是:

12345
你能帮我吗?我什么都试过了。。。下面是代码片段。另外,在关闭新元素的标记之前,即在

??
//代码从这里开始
TiXmlDocument文档;
TiXmlDeclaration*decl=新的TiXmlDeclaration(“1.0”、“utf-8”和“);
//doc.FirstChildElement();
LinkedChild文件(decl);
TiXmlElement*rootelement=新的TiXmlElement(“测试数据”);
doc.LinkEndChild(rootelement);
TiXmlText*textTestData=新的TiXmlText(“”);
rootelement->LinkEndChild(textTestData);
//操作员节点
TiXmlElement*运算符=新的TiXmlElement(“运算符”);
//树根
rootelement->LinkEndChild(操作符);
TiXmlText*textOperator=新的TiXmlText(“Alex”);
操作符->LinkedChild(textOperator);
//ParentBarcode节点
TiXmlElement*条形码=新的TiXmlElement(“父条形码”);
//树根
rootelement->LinkEndChild(条形码);
//将串行数据保存到stringstream
串流序列;
序列号);
std::string myserial=serial.str();
//删除空格
擦除(std::remove_if(myserial.begin()、myserial.end()、::isspace)、myserial.end());
字符缓冲区[sizeof(myserial)+1];
//int-ret=snprintf(缓冲区,sizeof(myserial),“%05ld”,DlgPtr>mlserialNumber);
int ret=sprintf_s(缓冲区,大小为(myserial),“%05ld”,myserial);
const char*charSerial=缓冲区;
TiXmlText*textbarcode=新的TiXmlText(charSerial);
条形码->LinkedChild(文本条形码);
没有错误消息,只是元素的标记不在同一行上关闭。
我用完全相同的DOM树做了一个小沙盒项目,但在那里效果很好。我在想,也许还有另一个问题我没有看到sprintf_s??提前谢谢。

正如@AlanBirtles在评论中指出的,您的代码的这一部分并不好:

stringstream serial;
serial << (DlgPtr->m_lSerialNumber);
std::string myserial = serial.str();
//Removing spaces
myserial.erase(std::remove_if(myserial.begin(),     myserial.end(),::isspace), myserial.end());

char buffer[sizeof(myserial) + 1];
int ret = sprintf_s(buffer, sizeof(myserial), "%05ld", myserial);
const char * charSerial = buffer;
TiXmlText *textbarcode = new TiXmlText(charSerial);
barcode->LinkEndChild(textbarcode);
这很好,但从C++11开始,您也可以执行以下操作:

std::string myserial = std::to_string(DlgPtr->m_lSerialNumber);
然后从
myserial
中删除空格,这并没有什么坏处,但我很确定不会有空格需要删除,因为您刚刚从单个整数构造了字符串

这就是它开始出错的地方

你制作了一个字符数组缓冲区来写入你的数字,但是你用
sizeof(myserial)
来调整它的大小,这会给你对象在内存中占用的字节数,包括簿记内容、vtable指针等。所以你在这里分配了太多的空间
myserial.size()
会让您更适合

然后尝试使用
sprintf\u s
将数字写入新的缓冲区,但使用
%05ld”
作为格式字符串,使用std::string作为参数-这根本不起作用<代码>%05ld“告诉
sprintf_s
期望一个整数作为输入(并用额外的零将其填充到5位数字),因此它只接受该参数,将其强制转换为整数,并将前4个字节解释为数字-这没有意义,可能会调用未定义的行为

这不仅不能满足您的要求,而且您已经有了一个包含您的号码的字符串,您只需调用
myserial.c_str()
即可获得包含
myserial
内容的
const char*
。这意味着整个第二部分可以替换为:

TiXmlText *textbarcode = new TiXmlText(std::to_string(DlgPtr->m_lSerialNumber).c_str());
barcode->LinkEndChild(textbarcode);

正如@AlanBirtles在评论中指出的,您的代码的这一部分不是很好:

stringstream serial;
serial << (DlgPtr->m_lSerialNumber);
std::string myserial = serial.str();
//Removing spaces
myserial.erase(std::remove_if(myserial.begin(),     myserial.end(),::isspace), myserial.end());

char buffer[sizeof(myserial) + 1];
int ret = sprintf_s(buffer, sizeof(myserial), "%05ld", myserial);
const char * charSerial = buffer;
TiXmlText *textbarcode = new TiXmlText(charSerial);
barcode->LinkEndChild(textbarcode);
这很好,但从C++11开始,您也可以执行以下操作:

std::string myserial = std::to_string(DlgPtr->m_lSerialNumber);
然后从
myserial
中删除空格,这并没有什么坏处,但我很确定不会有空格需要删除,因为您刚刚从单个整数构造了字符串

这就是它开始出错的地方

你制作了一个字符数组缓冲区来写入你的数字,但是你用
sizeof(myserial)
来调整它的大小,这会给你对象在内存中占用的字节数,包括簿记内容、vtable指针等。所以你在这里分配了太多的空间
myserial.size()
会让您更适合

然后尝试使用
sprintf\u s
将数字写入新的缓冲区,但使用
%05ld”
作为格式字符串,使用std::string作为参数-这根本不起作用<代码>%05ld“告诉
sprintf_s
期望一个整数作为输入(并用额外的零将其填充到5位数字),因此它只接受该参数,将其强制转换为整数,并将前4个字节解释为数字-这没有意义,可能会调用未定义的行为

这不仅不能满足您的要求,而且您已经有了一个包含您的号码的字符串,您只需调用
myserial.c_str()
即可获得包含
myserial
内容的
const char*
。这意味着整个第二部分可以替换为:

TiXmlText *textbarcode = new TiXmlText(std::to_string(DlgPtr->m_lSerialNumber).c_str());
barcode->LinkEndChild(textbarcode);

sizeof(myserial)
更改为
myserial.size()
或仅使用
TiXmlText*textbarcode=new TiXmlText(myserial.cstr())
sprintf_s(缓冲区,大小(myserial),“%05ld”,myserial)是完全错误的。你会怎么做呢?int ret=snprintf_s(缓冲区,大小(myserial),“%05ld”,DlgPtr>m_lSerialNumber);在代码中似乎工作正常。对于C++编程BTW还是新的,如果这条线工作,为什么它被注释掉?使用导致您的问题的实际代码将
sizeof(myserial)
更改为
myserial.size()
或仅使用
TiXmlText*textbarcode=new TiXmlText(myserial.cstr())
sprintf_s(缓冲区,大小(myserial),“%05ld”,myserial)是完全错误的。你会怎么做呢?int ret=snprintf_s(缓冲区,大小