TinyXML以及标签和格式问题



我在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中删除空格,这并没有什么坏处 - 但我很确定不会有任何要删除的,因为你刚刚从单个整数构造了字符串。

这就是它开始出错的地方。

你创建一个字符数组缓冲区来写入你的数字,但你用sizeof(myserial)来调整它的大小,这给了你对象在内存中占用的字节数,包括簿记的东西、vtable 指针等。所以你最终在这里分配了太多的空间;myserial.size()会给你一个更好的选择。

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

这不仅不能做你想要它做的事情,你已经有一个字符串,里面有一个包含你的号码的字符串,并且只需调用myserial.c_str()就可以const char*myserial的内容。这意味着整个第二部分可以替换为:

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

相关内容

  • 没有找到相关文章

最新更新