背景:所以我创建了一个VC ++,MFC应用程序,它基本上是一个大的首选项对话框,用户可以在其中配置多个页面,每个页面都有一堆不同的设置。然后将这些页面导出到XML文件以配置另一个应用程序。所以基本上它是一个GUI,XML编写器。
由于设置太多,我真的需要能够支持将设置导入应用程序,这样用户每次想要进行更改时都不必重新输入每个值。我希望能够支持导入XML文件(如它生成的文件)。
我知道XML解析器以及如何解析文件的值,但我不知道如何处理我当前的问题,因为有数百个变量。在时间方面,为每个变量搜索XML文档以找到调用UpdateData(FALSE)的匹配值是不是很慢?是否有更简单/更好/更快的解决方案?
编辑:此外,我不希望每次都依赖于XML标签的顺序相同。从技术上讲,他们将是我生成它们,但我不想假设它。
编辑2:大部分文档都是这样的......有一些分区,但还不够,我不认为。
<MAIN_APP>
<!-- General Configuration -->
<BARCO_ENABLED>1</BARCO_ENABLED>
<CHANNEL_COUNT value = "1" />
<!-- Elevation Data Format: 0 = DTED; 1 = RDTED-->
<ELEVATION_DATA_FORMAT value = "0" />
<BLOCKS_PER_FRAME value = "4" />
<PROCESS_FACTOR value = "0" />
<!-- Message Processing: 0=Default, 1:Immediate -->
<IMMEDIATE_MESSAGE_MODE value = "0" />
<!--Threat Diameter Size In Texels: 0 = 256(default); 1 = 512; 2 = 1024; 3 = 2048 -->
<THREAT_DIAMETER_TEXEL_COUNT value = "2" />
<!-- Texture Size: 0 = 256X256 (default); 1 = 512X512; 2 = 1024X1024; 3 = 2048X2048 -->
<DATAFRAME_TEXTURE_SIZE value = "2" />
<GEOCHIP_TEXTURE_SIZE value = "0" />
<OWNSHIP_VISIBILITY_TEXTURE_SIZE value = "2" />
<!-- If the vehicle sensor texture is not used, it can be set to -1 to avoid allocation -->
<VEHICLE_SENSOR_TEXTURE_SIZE value = "-1" />
<!-- Map Timeout: -999 = No Timeout; > 0 = Time out in milliseconds -->
<MAP_TIMEOUT value = "-999" />
<!-- Image to use for the Map Standby screen -->
<MAP_STANDBY_IMAGE value = "/BMP/MAP_STANDBY.bmp" />
<!-- Maximum Frame Buffer Dimensions (pixels) -->
<VIEWPORT_WIDTH value = "1024" />
[ ... ]
</MAIN_APP>
以下是分割部分的示例。
<ROUTE_REPLAN_SIZE value = "25" />
<ROUTE_MAX_REPLAN_WAYPOINTS value = "5" />
<SYMBOL_RENDER_PRIORITY>
<TACTICAL value = "5" />
<USER value = "4" />
<DRAWINGFILE value = "2" />
<DVOF value = "0" />
<LOCAL_POINT value = "3" />
<MCHUM value = "1" />
<THREAT_RING value = "6" />
<THREAT_SYMBOL value = "7" />
<ARINC_424 value = "8" />
<DAFIF value = "9" />
<AIRSPACE value = "10" />
</SYMBOL_RENDER_PRIORITY>
<!-- GeoSymbol Library Configuratoin -->
<GEOSYMBOL_LIBRARY_CONFIG>
<!-- Predefined Symbol memory value is in KB -->
<PREDEFINED_SYMBOL_MEMORY value = "35000" />
<DYNAMIC_TACTICAL_COUNT value = "100" />
<DYNAMIC_USER_GEOSYMBOL_COUNT value = "32" />
<USER_GEOSYMBOL_SKIN_COUNT value = "32" />
<!-- DVOF Label Selection. Valid Input: 0 = NONE, 1 = AGL, 2 = MSL, 3 = BOTH -->
<VO_LABEL_DISPLAY value = "1" />
</GEOSYMBOL_LIBRARY_CONFIG>
答案 0 :(得分:0)
最好的方法是将xml分成小部分。每个gui表单都有组/面板。您可以根据 formname-panelname.xml 命名xml。每个面板应映射到单独的散列映射,即应该有一个散列映射,其中包含 formname-panelname 的所有值。通过这样做,在给定的时间,您将修改内存中的一个易于搜索的特定散列图。您可以添加新变量/删除旧变量并编辑名称。
答案 1 :(得分:0)
我假设您在XML中存储键/值对。一种简单的方法是将整个XML加载到某种辅助数据结构中,然后只查找给定键/元素的值。由于这将发生在内存中,因此它足够快(假设数据结构很有效)。例如,您可以将读取所有element_name / value对的函数写入散列表,这样您就可以非常有效地按元素名称进行查询。