- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个无法修复的 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);
关于c++ - TinyXML 以及标签和格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57866775/
我正在为我的应用程序使用 TinyXml 库,但 TiXmlDocument 对象只能加载 Xml 文件。它如何从字符串加载 Xml。你能告诉我如何做到这一点吗?非常感谢 涂。 最佳答案 您可以使用
有没有人有代码来遍历 TinyXML 中的子树的节点? IE:给定一个父级,遍历它的所有子级和所有子级的子级? 最佳答案 Begemoth 的回答对我来说听起来不错。 这是 TiXmlElement
大家好:)我开发了导出.xml文件(Android dimens文件)的程序。我的程序将导出 dimens_ldpi.xml、dimens_mdpi.xml、dimens_hdpi.xml 和 dim
我想在 xml 文件中添加元素。谁能帮我做到这一点? 以下是我的代码试用。 1.79639 0.430521 2.06832 0.652695
我不知道我做错了什么。我正在用 C++ 编写一个简单的程序来使用 TinyXml 编辑 xml 配置文件。 这是我的配置文件:
你好, 我有以下内容: class pers { public: pers(); std::string name; long favourite_numb
我正在尝试创建一个 XML 签名机制。我的 XML 可以像下面这样: ... ... 事实上,它对 Main 节点下的数据类型是不可知的。我只想计算包含在 Main 节点中的数据的
我有一个看起来像这样的 xml 文件 我正在尝试使用 TinyXML 在最后一个记录元素(具有最高 ID 的那个)之后插入
bool win::checkIfFScreen(sf::RenderWindow &window) { TiXmlDocument doc; TiXmlElement * fulls
我有一个这样的 xml 文件: 我想使用 tinyxml 根据条目名称(例如 (LengthFocalPointToISOCenter))检索所有值(例如 558)。这是我的代码,还没
试图编译 TinyXml++ tutorial使用 CodeBlocks (16.01) 和使用 VS2013,我在以下行遇到相同的错误: ticpp::Element* pElem = doc.Fi
我正在尝试将文件指针 popen 的输出连接到 TinyXML 的输入。 根据主页,最好的方法是使用解析方法: C style input: * based on FILE* * th
我正在尝试使用 TinyXML (c++) 从 xml 文件加载数据。 int height = rootElem->attrib("height", 480); rootElem 是加载的 xml
我正在尝试使用 TinyXml 从属性值中获取 std::string 。我唯一能得到的是 const char * val,而且我找不到任何方法从 const char * 转换为 std::str
我最近开始使用 tinyXML。问题是当我运行我的程序来读取 xml 时,它返回一个访问冲突。一条共同的线是: doc.FirstChildElement("Map")->FirstChildElem
我有一个 XML 文件,其中包含如下几行: B) ?(?&) ?(?E)"> 我在 C++ 中使用 TinyXML 库来解析此 XML 文件,但是当我尝试获取此类行的“pat”属性时,TinyXML
我有一个无法修复的 TinyXML 问题。我已经使用 C++ 扩展了一个 MFC 应用程序来工作。该应用程序进行自动化测试。完成后,它将所有数据保存在一个 XML 文件中。在我的 DOM 树的开头下方
当我尝试执行代码时遇到段错误,它编译时没有错误/警告,但在执行时给出错误段错误。下面是代码片段。 XMLElement *pStartTimeStamp = pRoot->FirstChildElem
我正在使用 tinyxml 来保存来自文本 ctrl 的输入。用户可以将他们喜欢的任何内容复制到文本框中,然后将其写入 xml 文件。我发现新行没有保存,& 字符也没有保存。奇怪的是 tinyxml
我有一个 xml 文件,程序的每个新线程 (BHO) 都使用同一个 Tinyxml 文件。 每次在程序中打开一个新窗口时,它都会运行这段代码: const char * xmlFileName = "
我是一名优秀的程序员,十分优秀!