2

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

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

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

4

4 回答 4

5

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

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

对于实现细节......好吧,有人已经指出了树结构。当您深入了解 XML 时,它基本上就是一棵树。

于 2012-11-28T00:29:43.997 回答
1

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

如果您有以下简单的 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”的根对象,这样您就不必一直手动循环。

这应该让您知道从哪里开始。真的没那么难。

于 2012-11-28T02:18:09.563 回答
0

扫描 xml 文件并检查到 ('>' 和 !='\n') 并开始将值存储到 '<'

于 2012-11-28T04:25:34.473 回答
0

If you don't want to use existing libraries, you will need to construct XML parser yourself. There's no way you can parse XML by hand efficiently.

I'd advise you to pick up basic concepts on:

  1. Regular Expressions
  2. DFA/NFA
  3. Lexer/Scanner
  4. Type of grammars (at least learn Regular Grammars & Context Free Grammars)
  5. BNF, EBNF
  6. Recursive Descent Parsing

Take this great course for free: https://www.coursera.org/course/compilers

If you are not constrained by time, take this as a learning opportunity.

Good luck!

于 2012-11-28T03:14:42.210 回答