c - 在 c 中实现 xml 解析器

标签 c xml data-structures tree

我正在考虑用 c99 构建一个简单的 xml 解析器,我想实现它的每一个细节只是为了学习目的,据我所知,最好的方法是实现一个树结构并将 xml 字符串标记为一个树结构,所以它看起来像 enter image description here

我将有 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/

相关文章:

c - 为什么 linux 108 上的 unix-sockets 允许最大路径长度?

c - fscanf() 仅拾取文件的第一行

xml - 为什么这个 XPath 表达式在 xmlstarlet 中没有返回正确的值?

java - 当我使用 main.xml 文件创建它时,如何通过 java 修改 Android 应用程序 UI?

ios - 在另一个类的一个 ViewController 的 TableView 上调用 reloadData 的正确方法是什么?

c++ - 这段C++队列实现有什么问题?

c - Head First C 程序(文本搜索程序)

打印时 C 变量丢失值

algorithm - 高效的嵌套优先级队列

algorithm - 如何测试 BST 在从排序数组构造后是否平衡