我们将不胜感激任何帮助,即使这只是一个快速的想法。
没有库(除了 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
有两个子节点的节点,Info
和 Exact
. Info
节点将具有三个子节点,Code
, City
, 和 ID
每个都包含一个带有数据的数据节点。 Exact
节点将有两个子节点,X
和 Y
,它们都包含数据节点。这是我看到的存储此类数据的最直接方式。
编辑:
对于正则表达式部分,我会尝试找到匹配的标签,然后递归到内容中,比如 "\<([^/>]+)\>((?!\</\1\>)*)\</\1\>"
,它会匹配开始标签,捕获看起来不像结束标签的内容,然后匹配结束标签。 (我可能使用的语法与您的工具使用的语法不同,抱歉。)但是,这种类型的匹配仅在内容中不能使用相同的标签名称时才有效。
此模式与以下输入匹配:
<House><Mouse><House></House></Mouse></House>
将捕获标签名称 House
和内容 <Mouse><House>
,这不是你想要的。避免错误匹配并非易事。
关于c++ - 使用 C++ 堆栈/队列解析 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928203/