【问题标题】:c++ xml chunk data errorc++ xml块数据错误
【发布时间】:2014-10-02 21:09:13
【问题描述】:

我有一个 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 之类的东西将处理的字符串子字符串稍后添加剩余的但它没有工作..有什么建议吗???谢谢

【问题讨论】:

  • 除非你有足够的内存将整个文件加载到一个字符串中,否则你需要注意“我读到的部分不完整,让我们继续下一部分”类型的场景。一次读取 245、3000 或 9000 个字符都没有关系,您必须在某个时候处理它。

标签: c++ xml xml-parsing


【解决方案1】:

如果您唯一要做的就是以块模式读取文件的验证器,那么您可能应该在某种单独的结构中跟踪打开和关闭的标签。如果你的缓冲区可以改变它的长度(我不确定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),则结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多