TinyXML出现问题,无法修复。我已经使用C++扩展了MFC应用程序的工作。该应用程序执行自动测试。完成后,它将所有数据保存在XML文件中。在我的DOM树的开头下方。

<?xml version="1.0" encoding="utf-8" ?>
<TestData>
<Operator>Alex</Operator>
<ParentBarCode>12345
</ParentBarCode>
<Measurements>

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

<ParentBarCode>12345</ParentBarCode>

请问你能帮帮我吗?我已经尝试了所有内容...下面的代码段。另外,在关闭新元素的标签之前,是否有任何方法可以删除换行符,即之前

</ParentBarCode>??

//Code starts here
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration("1.0","utf-8", "");
//doc.FirstChildElement();
doc.LinkEndChild(decl);
TiXmlElement *rootelement = new TiXmlElement("TestData");
doc.LinkEndChild(rootelement);
TiXmlText *textTestData = new TiXmlText("");
rootelement->LinkEndChild(textTestData);
//Operator node
TiXmlElement *Operator = new TiXmlElement("Operator");
//Tree root
rootelement->LinkEndChild(Operator);
TiXmlText *textOperator = new TiXmlText("Alex");
Operator->LinkEndChild(textOperator);
//ParentBarcode Node
TiXmlElement *barcode = new TiXmlElement("ParentBarCode");
//Tree root
rootelement->LinkEndChild(barcode);

//saving serial to a stringstream

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 = snprintf(buffer, sizeof(myserial), "%05ld", DlgPtr>m_lSerialNumber);
int ret = sprintf_s(buffer, sizeof(myserial), "%05ld", myserial);
const char * charSerial = buffer;
TiXmlText *textbarcode = new TiXmlText(charSerial);
barcode->LinkEndChild(textbarcode);

没有错误消息,只是元素的标记不在同一行上。
我使用完全相同的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);

您可以通过将DlgPtr->m_lSerialNumber转换为std::string来开始学习:
stringstream serial;
serial << (DlgPtr->m_lSerialNumber);
std::string myserial = serial.str();

很好,尽管从C++ 11开始,您也可以这样做:
std::string myserial = std::to_string(DlgPtr->m_lSerialNumber);

然后,您从myserial删除空格,这没有什么害处-但我很确定不会删除任何空格,因为您只是从单个整数构造了字符串。

这就是开始出错的地方。

您创建了一个char数组缓冲区以写入您的数字,但是使用sizeof(myserial)对其进行大小调整,从而为该对象提供了该对象在内存中占用的字节数,包括簿记资料,vtable指针等。因此,您也结束了分配工作这里空间很大; myserial.size()会更适合您。

然后,您尝试使用sprintf_s将数字写入新缓冲区,但是您使用"%05ld"作为格式字符串,并使用std::string作为参数-这将无法使用。 "%05ld"告诉sprintf_s期望一个整数作为输入(并将其填充为5个数字,并带有额外的零),因此它只接受该参数,将其强制转换为int,然后将前4个字节解释为数字-这没有意义,并且可能会调用 undefined 的行为。

这不仅不会做您想做的事情,而且您已经有了一个包含数字的字符串,并且可以仅调用myserial.c_str()来获取包含const char*内容的myserial。这意味着整个第二部分可以替换为:
TiXmlText *textbarcode = new TiXmlText(std::to_string(DlgPtr->m_lSerialNumber).c_str());
barcode->LinkEndChild(textbarcode);

09-10 04:07