1. 背景:
有一个项目需要我解析后台服务器返回的XML数据,但是因为后台Http接口返回的数据包是Json,XML只是其中的一部分,如下图所示:
可见,XML数据中,节点的属性数据都是\",这实际上是不符合XML规范的,也就无法正常解析,需要我自己在解析之前,做一次统一的替换,将其中的\"替换为"。
2. 初步方案:
我原计划采用std::replace(strXmlTxtFile.begin(), strXmlTxtFile.end(), '\\"', '\"');
但是编译报错:
后面经过请教发现,我犯了两个错误:1.两个字符应该是字符串,就不能用单引号了;2.std::replace是替换单字节的,不是字符串的。
3. 正确方案
用string的replace函数解决:
函数如下:
string ReplaceAll(std::string str, const std::string& from, const std::string& to) {
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
}
return str;
}
调用如下:
ifstream inXmlTxtFile;
inXmlTxtFile.open("C:/CAADoc/MachParasOptimization/TestXML/TestResult1.txt", ios::in);
if (!inXmlTxtFile.is_open())
{
cout << "读取文件失败" << endl;
return;
}
string strXmlTxtFile;
while (getline(inXmlTxtFile, strXmlTxtFile))
{
cout << strXmlTxtFile.c_str() << endl;
}
string str1 = "\\\"";
string str2 = "\"";
strXmlTxtFile = ReplaceAll(strXmlTxtFile, str1, str2);
cout << "替换后:" << strXmlTxtFile.c_str() << endl;
tinyxml2::XMLDocument doc;
doc.Parse(strXmlTxtFile.c_str());
// 根元素
tinyxml2::XMLElement* xmlRootElem = doc.RootElement();
cout << "根元素读取成功" << endl;
其中"\\\""最外面两个"指的是字符串的定义,中间两个\指的是转义。