读取变量的XML

时间:2011-07-28 20:03:17

标签: xml parsing visual-c++

背景:所以我创建了一个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>

2 个答案:

答案 0 :(得分:0)

最好的方法是将xml分成小部分。每个gui表单都有组/面板。您可以根据 formname-panelname.xml 命名xml。每个面板应映射到单独的散列映射,即应该有一个散列映射,其中包含 formname-panelname 的所有值。通过这样做,在给定的时间,您将修改内存中的一个易于搜索的特定散列图。您可以添加新变量/删除旧变量并编辑名称。

答案 1 :(得分:0)

我假设您在XML中存储键/值对。一种简单的方法是将整个XML加载到某种辅助数据结构中,然后只查找给定键/元素的值。由于这将发生在内存中,因此它足够快(假设数据结构很有效)。例如,您可以将读取所有element_name / value对的函数写入散列表,这样您就可以非常有效地按元素名称进行查询。