在没有库的情况下解析 C 中的 XML

Parsing XML in C without libraries.

本文关键字:中的 XML 情况下      更新时间:2023-10-16

谁能给我一个关于在只有标准库的独立 C 中解析 xml 的过程的概述。

我想把它作为实践,因为这实际上是一个有用的项目。

我看到的大多数示例似乎都大量使用指针和结构数组。因此,任何提示或概述将不胜感激。

好吧,你会看到两件不同的事情。 首先是实现这一目标的高级战略。 第二个是数据结构和其他特定于语言的实现细节,你将用来完成它。

对于高级部分,一个好的起点是学习有限自动机。 它们是一个非常强大的概念工具,用于规划解析和其他严重依赖状态的作业,并且很容易转换为代码。

有关实现详细信息...好吧,有人已经指出了树结构。 XML基本上是一棵树,当你深入到它时。

它非常简单,您只需阅读文本并将其构建到对象树中即可。

如果您有以下简单的 XML:

<A>Hello<B x="1">World</B></A>
<A>Another Object A</A>

你可以构建类似的东西:

Obj_1
  Name = "A"
  Text = "Hello"
  --> Obj_2
      Name = "B"
      Text = "World"
      Param_1 (Name = "x", Value = "1")
Obj_3
  Name = "A"
  Text = "Another Object A"

使用像这样的简单类对象,您可以构建树(我意识到您询问了在常规 C 中解析它,但您也标记了它C++所以我的示例在 C++):

class Obj
{
public:
  struct Param{
    std::string name;
    std::string value;
  };
  std::string      text;
  std::string      name;
  std::list<Param> params;
  std::list<Obj *> children;
};

然后,您需要添加一些帮助程序,以将值字符串(XML)转换为整数,双精度,布尔值等,并清理多余的空格。 您可能还希望添加一些代码来获取名为"XYZ"的所有根对象,这样您就不必一直手动循环。

这应该可以让您了解从哪里开始。 这真的不难。

如果您不想使用现有库,则需要自己构造 XML 解析器。您无法有效地手动分析 XML。

我建议您学习以下基本概念:

  1. 正则表达式
  2. DFA/NFA
  3. 词法分析器/扫描仪
  4. 语法
  5. 类型(至少学习常规语法和上下文自由语法)
  6. BNF, EBNF
  7. 递归下降分析

免费参加这门很棒的课程:https://www.coursera.org/course/compilers

如果您不受时间限制,请将其视为学习机会。

祝你好运!

扫描 xml 文件并检查到 ('>' 和 !=''),并开始存储高达 '<'

的值