gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:39:28 27 4
gpt4 key购买 nike

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com