我应该从以下XML文档中提取时间戳,并将时间戳输出到输出文件。但是,到目前为止我创建的内容除了提取前面的代码时还提取时间戳,当我只想要时间戳时(例如:timestamp =" 2014-07-08T18:14:16.468Z" )。有人可以指出我做错了什么吗?提前谢谢!
XML文档:http://pastebin.com/DLVF0cXY
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string tempStr;
ifstream inFile;
ofstream outFile;
outFile.open("Outputdata.txt");
inFile.open("Groupproject.xml");
if (inFile.fail()) {
cout << "Error Opening File" << endl;
system("pause");
exit(1);
}
while (inFile) {
inFile >> tempStr;
if (tempStr.find('Z\"') != string::npos) {
cout << "Found timestamp" << tempStr;
outFile << tempStr << endl;
cout << "Copied to file" << endl;
}
}
inFile.close();
outFile.close();
system("pause");
return 0;
}
答案 0 :(得分:0)
获得std::string
后,您可以使用它的成员函数来查找时间戳字段的出现位置。使用find
获取时间戳字段的开头并查找结尾。然后使用substr
函数提取正确的字符。
答案 1 :(得分:0)
正如Anon Mail建议的那样如果您尝试使用不同的参数解析整个.xml
文件,我建议您使用xml库,例如rapidxml或tinyxml。但是出于问题的目的,我已经包含了一个应该有效的代码版本。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
using namespace std;
string tempStr;
// escaped double qoute.
string findStr = "timestamp=\""
ifstream inFile;
ofstream outFile;
outFile.open("Outputdata.txt");
inFile.open("Groupproject.xml");
if (inFile.fail()) {
cout << "Error Opening File" << endl;
system("pause");
exit(1);
}
size_t found;
while (inFile) {
getline(inFile,tempStr);
found = tempStr.find(findStr);
if (found!=std::string::npos)
{
break;
}
}
// Erases from beggining to end of timestamp="
tempStr.erase(tempStr.begin(),(found + tempStr.length()));
// Finds index of next double qoute.
found = tempStr.findStr("\"");
if (found=std::string::npos)
{
cerr << "Could not find matching qoute:";
exit(1);
}
// Erases from matching qoute to the end of the string.
tempStr.erase(found, tempStr.end());
cout << "timestamp found" << tempStr << "Saving to outFile" << endl;
outFile << tempStr;
inFile.close();
outFile.close();
system("pause");
return 0;
}