【问题标题】:Parsing a XML file using C++ stacks/queues使用 C++ 堆栈/队列解析 XML 文件
【发布时间】:2016-04-29 01:44:20
【问题描述】:

任何帮助都将不胜感激,即使这只是一个快速的想法。

没有库(除了 stl)或外部解析器

我应该创建一个 c++ 程序来读取 XML 文件的数据并将其存储在内存中,但是我很难找到一种方法来执行此操作。我希望我能从这里的某个人那里得到一些指导。还应使用正则表达式来识别文件数据或将其拆分。

标签名称不需要保留,虽然它会很理想,只是嵌套数据,所有数据都存储为文本(字符串)

这是一个示例,向您展示了我所说的使用堆栈和队列的含义。但是,它需要是非特定的。

<House>                 // tag: push <House> on stack
  <Info>                // tag: push <Coordinates> on stack
    <Code>ABE</Code>    // element:  push_back on element queue
    <City>Allentown</City>   // element:  push_back on element queue
    <ID>PA</ID>         // element:  puch_back on element queue
  </Info>               // terminator:  pop stack and complete node in queue
  <Exact>               // tag:  push <Exact> on stack
    <X>40.65</X>        // element:  push_back on element queue
    <Y>75.43</Y>        // element:  push_back on element queue
  </Exact>              // terminator:  pop stack and complete node in queue
</House>                // terminator:  pop stack and complete node in queue

到目前为止,它很蹩脚,但我刚刚能够设置要逐行读取的文件,并通过使用正则表达式检测它来跳过标题,如下所示:

string fileline;
regex header("[<][?](.*?)[?][>]");
while (getline(ifstreamobj, fileline))
{
    if (regex_match(fileline, header))
    {
        cout<<"Skipping what appears to be a header"<<endl;
    }

    //?
}
cout << "END OF FILE, EOF" << endl;

我真的不知道该怎么办。我猜堆栈将是一堆字符串,标签名称将被推送/弹出

然后队列将是标签之间的实际数据

【问题讨论】:

  • 我建议您使用一些现有的 XML 解析器。 This SO answer 的收藏似乎不错。
  • 真正的xml解析不是开玩笑,是不是只需要解析xml的一个子集?此外,您的 xml 格式错误 &lt;X&gt;40.65&lt;/Latitude&gt;.
  • 糟糕,现已修复。我需要像显示的那样解析整个 xml 文件,但我不会比嵌套的 3 更深
  • @Raw N,fman 说没有外部解析器。要么这是一个任务并且 fman 没有告诉我们(如果是这种情况,应该使用哪个 fman),或者 fman 正在为因某种原因不允许外部解析器的人工作(应该已经说明),或者 fman 是寻找挑战,是一个贪吃的惩罚。
  • @KyleA 这是涉及对数据进行统计的整个项目的一部分,但是,我需要解析一个 xml 文件来获取该数据。

标签: c++ regex xml stack queue


【解决方案1】:

假设您说“没有库”时是指非标准库,否则这将成为一项非常非常困难的任务。

我会用一棵树。这样,在您的示例中,您将拥有一个带有两个子节点 InfoExactHouse 节点。 Info 节点将具有三个子节点,CodeCityID,每个子节点都包含一个带有数据的数据节点。 Exact 节点将有两个子节点,XY,它们都将包含数据节点。这是我看到的存储此类数据的最直接的方式。

编辑: 对于正则表达式部分,我会尝试找到匹配的标签,然后递归到内容中,比如"\&lt;([^/&gt;]+)\&gt;((?!\&lt;/\1\&gt;)*)\&lt;/\1\&gt;",它会匹配一个开始标签,捕获看起来不像结束标签的内容,然后匹配结束标签。 (抱歉,我使用的语法可能与您的工具不同。)但是,这种类型的匹配只有在内容中不能使用相同的标签名称时才有效。

此模式与以下输入匹配:

<House><Mouse><House></House></Mouse></House>

将捕获标签名称House 和内容&lt;Mouse&gt;&lt;House&gt;,这不是您想要的。避免错误匹配并非易事。

【讨论】:

  • 谢谢。我将尝试制作一些正则表达式键。但就错误匹配而言,可以安全地假设标签之间的所有数据都只是字母
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2013-05-29
  • 2015-03-14
  • 2021-07-08
相关资源
最近更新 更多