我正在考虑用 c99 构建一个简单的 xml 解析器,我想实现它的每一个细节只是为了学习目的,据我所知,最好的方法是实现一个树结构并将 xml 字符串标记为一个树结构,所以它看起来像
我将有 2 个简单的结构,一个代表一个节点,一个代表一个属性,上面的设计有多糟糕?
有什么改进建议吗?
最佳答案
撇开你选择的任务的复杂性不谈,你的数据结构乍一看不错,但在我看来有两三处错误:
- 您不仅要考虑子节点,还要考虑共享同一父节点的兄弟节点
- 没有必要将 sttribute 树变成二叉树。为简单起见,我只使用单链表。
- 您需要考虑左括号和右括号之间的节点内容(除非您的节点结构已经考虑到了它。)
因此,您确实需要 xml 结构本身的二叉树和每个节点的属性链表。例如,考虑这个简单的 xml 样式数据:
<dinner time="19:00" dresscode="informal">
<course id="starter">
<food>Consomme</food>
<food>Tomato soup</food>
<course>
<course id="salad" optional=optional>
<food>Green salad</food>
<course>
<course id="main">
<food>Steak and kidney pie</food>
<food type=vegetarian>Spinach lasagna</food>
<course>
<course id="dessert">
<food>Fruit</food>
<food>Ice cream</food>
<food>Coffee</food>
<course>
</dinner>
food
项是course
的子项,但如果它们与父项具有相同的course
,则它们是彼此的 sibling 。树结构看起来像缩进:同一级别的项目是兄弟,缩进的项目是 child 。
你只需要保留一个指向最老 child 的指针,其他 child 可以通过兄弟关系到达,这也是一个指针。 (在二叉树命名法中, child 是 left
链接,siblings 是 right
链接。)为了便于遍历,您还应该保留指向父级的指针。
文本和属性只是附加到节点的数据。
(当然,查看现有 XML 解析器的源代码可能会给您更好的想法。)
关于c - 在 c 中实现 xml 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21400217/