c++ - 使用 C++ 堆栈/队列解析 XML 文件

标签 c++ regex xml stack queue

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

没有库(除了 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

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

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;

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

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

最佳答案

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

我会用一棵树。这样在你的例子中你会有一个 House有两个子节点的节点,InfoExact . Info节点将具有三个子节点,Code , City , 和 ID每个都包含一个带有数据的数据节点。 Exact节点将有两个子节点,XY ,它们都包含数据节点。这是我看到的存储此类数据的最直接方式。

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

此模式与以下输入匹配:

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

将捕获标签名称 House和内容 <Mouse><House> ,这不是你想要的。避免错误匹配并非易事。

关于c++ - 使用 C++ 堆栈/队列解析 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928203/

相关文章:

xml - 用 Java 托管 XML 的简单服务器

C++ 使用 GTK+ 制作 2D 游戏图形

c++ - 为什么此方法代码不将整数作为参数

c++ - 包含引用的对象 vector

android - 我如何以编程方式引用/values/strings.xml 文件中的内容?

python - iShares SP 500 ETF 的 Excel 文件有什么问题?

c++ - 修复 lib 兼容性 c++ mingw 和 postgresql

javascript - 唯一编号的正则表达式。

java - 正则表达式同时显示不同的返回不同的结果

javascript - 使用 JavaScript 进行搜索的正确正则表达式