XML文件中的动态变量和函数调用

时间:2014-03-02 08:47:56

标签: c++ xml xml-parsing interpreter

我正在使用libxml2为我的应用程序解析xml文档。我希望能够在XML中使用变量甚至函数调用。例如,像:

<元素attr1 =“$ variable1”attr2 =“= rand(1,2,3,4)”/>

变量可以在XML中定义并重新使用,或者在加载XML的代码中的某处定义/硬编码。可以在代码中定义函数(即从XML调用C函数)。

我的应用程序已经加载了XML文档,我可以在内存中加载和修改XML,但我想知道:评估变量和函数调用的最佳方法是什么?

我可以使用任何XML库或解释器库吗?

1 个答案:

答案 0 :(得分:1)

您必须实现一个简单的解析器(或复杂的,取决于您需要的),它可以理解变量和函数。

第一步是从attr1="$variable1"中提取表达式 - 在简单的情况下,这只是查看字符串中的第一个字符,看它是'$'还是{{1} }。

如果所有变量都是整数,则可以轻松地将变量存储在'='中。如果允许该值为多个类型,则可以将值存储为字符串(并根据需要进行转换),或者具有包含有关实际内容类型的信息的结构/类。

评估像std::map<std::string, int>这样的表达式会涉及某种“字符串到函数”构造。一个非常简单的方法是if / else链。这里我们假设您已将函数名称解压缩为名为=rand(1,2,3,4)

的独立字符串
funcname

更复杂但通常更有效的解决方案是拥有一个包含字符串和函数指针的结构。搜索字符串,然后调用该函数。

另一种选择是使用if (funcname == "rand") { ... do stuff here... } else if (funcname == "sin") { .... } ,其中std::map<std::string, functionType>是标准化函数的typedef。

后两种解决方案的机器人很大程度上依赖于标准功能类型。您可以通过例如functionType作为参数来标准化函数 - 函数可以使用std::vector<Arg> args检查参数的数量。

我希望这会帮助你一路......