C 示例如何从XML文件中读取多个值,并将它们与一个值进行有效比较

C 示例如何从XML文件中读取多个值,并将它们与一个值进行有效比较,c,xml,C,Xml,这确实是一个两个尺度的问题。我们如何从XML文件中高效地读取多个值,然后如何将它们与不同的值进行比较 尽可能有效地完成这项工作是非常重要的,这才是真正的问题所在 以下是现有代码的示例: if (strcasecmp(stMsgData->paramName,"Device.a.b") == 0) { ret = aFunction(); } else if (strcasecmp(stMsgData->paramName,"Device.z.o

这确实是一个两个尺度的问题。我们如何从XML文件中高效地读取多个值,然后如何将它们与不同的值进行比较

尽可能有效地完成这项工作是非常重要的,这才是真正的问题所在

以下是现有代码的示例:

if (strcasecmp(stMsgData->paramName,"Device.a.b") == 0)
    {
        ret = aFunction();
    }
    else if (strcasecmp(stMsgData->paramName,"Device.z.o") == 0)
    {
        ret = bFunction();
    }
    else if (strcasecmp(stMsgData->paramName,"Device.g.j") == 0)
    {
        ret = cFunction();
    }
为了更好的例子,我们假设Device.a.b实际上是Device.DeviceInfo.ManufacturerOUI。我们要实现的主要功能是“Device.DeviceInfo.ManufacturerOUI”也可以是“Device.DeviceInfo.OUI”或“Device.DeviceInfo.ManfOUI”等等。由于我们希望避免重新编译和去更新可能600项或更多项的代码,最好的方法似乎是从XML(如果更合理的话,欢迎XML的替代品)文件进行比较。问题是,如何以最有效的方式实现这一点(示例代码),以及是否有任何进一步的建议


非常感谢。

简言之:这里的性能问题是虚假的,从文件读取比比较和几个分支慢很多

实践关注:过早优化 真的,这整件事充满了过早优化的味道尤其是,因为您正在从文件读取此数据。因此,如果您只是从文件中读取值,那么性能将主要取决于您读取文件的速度,因为:

  • 文件访问(通常)比比较慢很多,除非它是由操作系统缓存的

  • 正确读取XML要比这些类型的比较慢得多。相对而言,快速读取XML文件仍然非常缓慢

不要太担心性能,专注于一个好的设计,而不必尝试所有你能想到的很酷的东西,比如XML。您可以随时在以后对其进行分析和优化

如果您真的希望这个过程快速,我认为您可以做的主要区别是不使用XML。这似乎是您项目中的一个选择,这让我进入下一部分的答案

设计关注点:构建您的项目 我认为你需要对建筑做更多的研究。您担心每次更改某些值时都必须重新生成“整个项目”,但有一些合理的方法可以解决这一问题,例如将这些值存储在单独的编译单元中。然后,您可以在更改值并重新链接项目时重新编译该文件。他们在项目其余部分使用的方法取决于您,但是全局常量变量可能是C的最佳方式

比较字符串 假设我们不将这些值存储在单独的编译单元中

如果你说你想检查数百个可能的字符串,我想你应该用一个字符串来辅助检查。为每个可能的值提供键,如果某些允许的键具有替代项,则表中的映射值可以包含每种类型键的唯一标识符


e、 g.“Device.DeviceInfo.ManufacturerOUI”和“Device.DeviceInfo.OUI”都可以映射到ID
Device\u INFO\u OUI

简言之:这里的性能问题是虚假的,从文件读取的速度比比较和几个分支慢

实践关注:过早优化 真的,这整件事充满了过早优化的味道尤其是,因为您正在从文件读取此数据。因此,如果您只是从文件中读取值,那么性能将主要取决于您读取文件的速度,因为:

  • 文件访问(通常)比比较慢很多,除非它是由操作系统缓存的

  • 正确读取XML要比这些类型的比较慢得多。相对而言,快速读取XML文件仍然非常缓慢

不要太担心性能,专注于一个好的设计,而不必尝试所有你能想到的很酷的东西,比如XML。您可以随时在以后对其进行分析和优化

如果您真的希望这个过程快速,我认为您可以做的主要区别是不使用XML。这似乎是您项目中的一个选择,这让我进入下一部分的答案

设计关注点:构建您的项目 我认为你需要对建筑做更多的研究。您担心每次更改某些值时都必须重新生成“整个项目”,但有一些合理的方法可以解决这一问题,例如将这些值存储在单独的编译单元中。然后,您可以在更改值并重新链接项目时重新编译该文件。他们在项目其余部分使用的方法取决于您,但是全局常量变量可能是C的最佳方式

比较字符串 假设我们不将这些值存储在单独的编译单元中

如果你说你想检查数百个可能的字符串,我想你应该用一个字符串来辅助检查。为每个可能的值提供键,如果某些允许的键具有替代项,则表中的映射值可以包含每种类型键的唯一标识符

e、 g.“Device.DeviceInfo.ManufacturerOUI”和“Device.DeviceInfo.OUI”都可以映射到ID
设备信息OUI