代码之家  ›  专栏  ›  技术社区  ›  Stephane Rolland

您能用<regex>实现一个轻量级的XML解析器吗?

  •  4
  • Stephane Rolland  · 技术社区  · 14 年前

    在我的例子中,XML解析将是最简单的:只有标记和文本内容。没有名称空间,没有属性,没有模式支持(一开始肯定,但也许…)。

    我认为这将是一个很好的锻炼我学习新的C++0x< 但是,我想知道XML解析是否不会超过适当的regex限制。

    4 回复  |  直到 14 年前
        1
  •  11
  •   Oliver Charlesworth    14 年前

    一句话:不,XML不是一种常规语言。

    更新 (根据以下评论中的讨论进行扩展)

    虽然你可以编写一个基于状态机的解析器,它使用正则表达式来执行词汇化/标记化,但这并不比使用一个用于工作的工具更有效,更容易出错。正如其他人所说,Flex/Bison是一种选择。

        2
  •  4
  •   Chris    14 年前

    如果必须这样做,我会使用一个真正的lexer/parser生成器,比如flex/yacc。是的,这是更多的工作开始,但一旦你支付了安装成本,增加对额外功能的支持就容易多了。另外,flex和yacc经过几十年的优化,因此它们生成的代码比手工编写的任何代码都要快得多。

        3
  •  1
  •   Damien    14 年前

    如果只使用XML的一个子集,就很容易做到。只需一个字符一个字符地读取XML,然后用一堆布尔值(比如in_au标记)更新状态。它比使用regex做任何事情都要快,而且您不必处理行或内存问题(尝试匹配行?一整份文件?如果一行有几个元素呢?如果标签在两行上呢?)

        4
  •  1
  •   Roger Pate Roger Pate    14 年前

    如果您真的需要解析XML:不需要,可以使用一个真正的XML解析器。

    如果你只是想通过一个练习来获得一些新的C++0X正则表达式库的经验:试着找到一个更好、更有用的项目。首先,您需要有机会在以后使用的东西(参见上面关于真正的XML解析器的内容)。也就是说,有更糟糕的方法来学习regex库。:)