c ++ xml块数据错误

时间:2014-10-02 21:09:14

标签: c++ xml xml-parsing

我在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将处理的字符串子字符串然后添加剩余的但它没有工作..任何建议???谢谢

1 个答案:

答案 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)