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

时间:2012-11-28 00:25:56

标签: c++ c xml algorithm parsing

任何人都可以给我一个关于仅使用标准库在独立C中解析xml的过程的概述。

我希望将此作为实践工作,因为这实际上是一个有用的项目。

我看到的大多数示例似乎都使用了很多指针以及结构数组。所以任何提示或大纲都会受到赞赏。

4 个答案:

答案 0 :(得分:5)

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

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

对于实现细节......好吧,有人已经指出了树结构。当你开始使用XML时,XML基本上就是一棵树了。

答案 1 :(得分:0)

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

如果你有以下简单的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)之间进行转换,以整数,双精度,bool等,并清理额外的空格。您可能还想添加一些代码来获取名为“XYZ”的所有根对象,这样您就不必一直手动循环。

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

答案 2 :(得分:0)

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

我建议你选择基本概念:

  1. 正则表达式
  2. DFA / NFA
  3. 词法/扫描仪
  4. 语法类型(至少学习普通语法和语境自由语法)
  5. BNF,EBNF
  6. 递归下降解析
  7. 免费参加这个精彩的课程:https://www.coursera.org/course/compilers

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

    祝你好运!

答案 3 :(得分:0)

扫描xml文件并检查('&gt;'和!='\ n')并开始将值存储到'&lt;'