我在C ++中有一个xml阅读器,我正在创建一个错误函数或校对器,它只向解析器发送完整的xml树。数据位于像
这样的char数组中char chunkdata[245];
然后将其转换为类似
的字符串String data(chunkdata);
解析数据。 该程序将随时和处理获得分块数据。分块数据的唯一之处在于它有时会发送不完整的xml树...所以我可能只得到char数组中的一半内容,如
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to> Tove</to>
<from>Jani</from>
<heading>Remin
几秒钟之后,其余的
der</heading>
<body>Don't forget me this weekend!</body>
</note>
处理完毕后会生成两个字符串并导致程序崩溃。
我可以在我的代码中添加什么,或者等待添加,如果不完整...或者只获取完整的xml树,并留下剩下的来添加到其余的时候...我试过像字符串FIND with将处理的字符串子字符串然后添加剩余的但它没有工作..任何建议???谢谢
答案 0 :(得分:0)
如果您唯一要做的是以块模式读取文件的验证器,那么您应该在某种单独的结构中跟踪打开和关闭的标签。如果你的缓冲区可以改变它的长度(我不确定String
是什么,但std::string
当然可以在运行时改变它的大小),你可能希望得到类似于以下内容的东西:
std::map<std::string, long> tags;
当您遇到标签打开时,请执行以下操作:
if(tags.find(tagName))
tags[tagName]++;
else
tags[tagName]=1;
当您遇到标签关闭时,请执行以下操作:
if(tags.find(tagName))
tags[tagName]--;
else
tags[tagName]=-1;
只有当地图的所有元素都相等0
时,标签才会正确关闭。假设testForCorrectness()
就是这样做的。然后你的代码看起来像这样:
char chunkdata[245];
readSomeData();
String data(chunkdata);
while(!testforCorrectness()){
readSomeData();
data += (String)chunkdata;
}
return chunkdata;
如果您还想测试标签是否以正确的顺序关闭 - 请尝试使用vector
代替:
std::vector<std::string> openedTags;
在标签上开始:
openedTags.push_back(tagName);
关闭标签:
if(openedTags.back() == tagName)
openedTags.pop_back();
else
// XML is ill-formed
完成empty(openedTags)
。