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

标签 c xml

这实际上是一个二阶问题。我们如何从 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 语言的最佳方式。

比较字符串

假设我们不将值存储在单独的编译单元中。

鉴于您说您希望能够检查数百个可能的字符串,我认为您应该使用字符串 hash table 来辅助此检查。 .为每个可能的值提供键,如果某些允许的键有替代项,则表中的映射值可以包含每种键类型的唯一标识符。

例如“Device.DeviceInfo.ManufacturerOUI”和“Device.DeviceInfo.OUI”都可以映射到 ID DEVICE_INFO_OUI

关于c - 如何从 XML 文件中读取多个值并将它们与一个值进行有效比较的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942475/

相关文章:

php - 为一个元素创建多个属性

java - 从 xml 节点获取行号 - java

java - 循环通过 XML 来构建对象

python - 在 Python 中读取 Maven Pom xml

将 head 程序转换为 tail C

c - 在 C 可执行文件中动态包含文本

c - 当遇到 exit(1) 时,malloc 的内存会发生什么情况?

Java - 子节点的 dom4j XPath

c - 如何从字符串重建原始 BLOB 值?

c - C 中枚举存储大小未知