【问题标题】:Implementing an xml parser in c在c中实现xml解析器
【发布时间】:2014-01-28 08:18:41
【问题描述】:

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

我将有两个简单的结构,一个代表一个节点,一个代表一个属性,上面的设计有多糟糕?

有什么改进建议吗?

【问题讨论】:

  • 您应该知道的第一件事是,XML 解析器没有什么“简单”的,至少如果您希望它完整的话。
  • @JoachimPileborg 我经常使用简单这个词,虽然我知道它不会那么简单
  • (1.) 阅读并理解此链接中的信息 --> w3.org/TR/REC-xml (2.) 现在重新思考一切。 (3.) 软件工程是一门精确的艺术,需要数年时间才能接近“正确”。
  • 看看Expat XML 解析器。它是独立的,并且可能尽可能“简单”。
  • 我建议从更简单的东西开始(比如 JSON),但由于这是为了学习目的,所以最好了解一下 XML 到底是什么混乱:P

标签: c xml data-structures tree


【解决方案1】:

抛开你选择的任务的复杂性不谈,你的数据结构乍一看还不错,但在我看来有两三个地方有问题:

  • 您不仅要考虑子节点,还要考虑共享同一父节点的兄弟节点
  • 没有必要使属性树成为二叉树。为简单起见,我只使用单链表。
  • 您需要考虑左括号和右括号之间的节点的内容(除非您的节点结构已经考虑了它。)

因此,您确实需要 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 项是 courses 的子项,但如果它们具有相同的 course 作为父项,则它们是彼此的兄弟。树形结构看起来像缩进:同一级别的项是兄弟,缩进的项是子项。

你只需要保留一个指向最大孩子的指针,其他孩子可以通过兄弟关系访问,这也是一个指针。 (在二叉树命名法中,子节点是 left 链接,兄弟节点是 right 链接。)为了便于遍历,您还应该保留指向父节点的指针。

文本内容和属性只是附加到节点的数据。

(当然,查看现有 XML 解析器的源代码可能会给您带来更好的想法。)

【讨论】:

    【解决方案2】:

    在查看树的设计时,有必要写下您的目标并确定其优先级,因为它们可以帮助您做出权衡决策。我认为可能有三个关键指标:构建树的时间、导航树的时间(通常是自上而下的递归下降)和空间占用。当然,还要加上开发工作。另一个重要因素是您希望树是可变的(例如,根据 DOM 的要求)还是不可变的(例如,对于 XPath/XSLT/XQuery)。

    其他特定于 XML 的因素:您希望在树中保留多少信息?例如。是否要保留 CDATA 部分边界?和实体引用?或者你想扩展这些内联?

    我不知道 c99 是什么,它可能会施加额外的限制或提供机会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2013-06-26
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多