Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在没有库的情况下用C解析XML。_C++_C_Xml_Algorithm_Parsing - Fatal编程技术网

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

C++ 在没有库的情况下用C解析XML。,c++,c,xml,algorithm,parsing,C++,C,Xml,Algorithm,Parsing,有谁能给我一个关于在只有标准库的独立C中解析xml的过程的概述吗 我想把它作为一种实践,因为这实际上是一个有用的项目 我看到的大多数示例似乎都大量使用指针和结构数组。因此,任何提示或提纲都将不胜感激。嗯,您将看到两个不同的方面。首先是实现这一目标的高级别战略。第二个是数据结构和其他特定于语言的实现细节 对于高级部分,一个好的起点是研究有限自动机。它们是一个非常强大的概念工具,用于规划解析和其他严重依赖于状态的作业,并且可以很容易地转换为代码 有关实施细节。。。有人已经指出了树的结构。XML基本上

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

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


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

嗯,您将看到两个不同的方面。首先是实现这一目标的高级别战略。第二个是数据结构和其他特定于语言的实现细节

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


有关实施细节。。。有人已经指出了树的结构。XML基本上是一棵树。

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

如果您有以下简单的XML:

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

使用这样的简单类对象,可以构建树(我意识到你问的是在正则C中解析它,但你也标记了C++,所以我的例子是C++):

类Obj
{
公众:
结构参数{
std::字符串名;
std::字符串值;
};
std::字符串文本;
std::字符串名;
std::列表参数;
性病:列出儿童;
};
然后,您需要添加一些帮助程序来将值字符串(XML就是这样)转换为整数、double、bools等,并清除多余的空白。您可能还需要添加一些代码来获取所有名为“XYZ”的根对象,这样就不必一直手动循环


这会让你知道从哪里开始。这真的没那么难。

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

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

  • 正则表达式
  • DFA/NFA
  • 激光扫描器
  • 语法类型(至少学习常规语法和上下文无关语法)
  • BNF,EBNF
  • 递归下降解析
  • 免费参加这门很棒的课程:

    如果你不受时间限制,就把这当作一个学习的机会


    祝你好运

    扫描xml文件并检查('>'和!='\n'),然后开始存储值,直到“嗯,您将从文件中的数据构建一个树结构。这个问题在编译器的前端是很重要的,通常的编译器文本是开始的地方。我写了很多玩具程序,但是手工解析XML是我从来都不想做的事情。你有没有做这方面的资源?或者我可以看看基本的实现。正如前面提到的,这确实是一个大而复杂的项目,可能需要相当长的时间。你考虑过像.ini这样更简单的格式吗?@sdsd:它不是那么高级,而是毫无意义。它是为其编写解析器最不有趣的语言(因为它几乎不是一种语言),但它却有所有关于名称空间、URI、编码等的恼人规则。
    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"
    
    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;
    };