Читать XML для переменных - PullRequest
0 голосов
/ 29 июля 2011

Справочная информация : Итак, я создал приложение VC ++, MFC, которое в основном представляет собой большой диалог настроек, в котором пользователь может настроить несколько страниц, каждая из которых имеет несколько различных настроек. Затем эти страницы экспортируются в файлы XML для настройки другого приложения. Так что, в основном, это графический интерфейс XML Writer.

Поскольку настроек так много, мне действительно нужно иметь возможность импортировать настройки в приложение, чтобы пользователю не приходилось повторно вводить каждое значение каждый раз, когда он / она хочет внести изменения. Я хотел бы иметь возможность поддерживать импорт файлов 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 голосов
/ 29 июля 2011

Я предполагаю, что вы храните пары ключ / значение в своем XML. Одним простым подходом было бы загрузить весь XML один раз в какую-то вспомогательную структуру данных, а затем просто искать значение для данного ключа / элемента. Поскольку это происходит в памяти, это будет достаточно быстро (при условии, что структура данных эффективна). Например, вы можете написать функцию, считывающую все пары element_name / value в хеш-таблицу, чтобы вы могли очень эффективно выполнять запросы по имени элемента.

0 голосов
/ 29 июля 2011

Лучший подход - разбить ваш xml на маленькие секции. Каждая форма GUI имеет группы / панели. Вы можете назвать xml на основе formname-panelname.xml . Каждая панель должна отображаться на отдельном хэш-карте, то есть должна быть хэш-карта, которая содержит все значения для formname-panelname . Делая это, в определенный момент вы будете изменять одну конкретную хэш-карту в памяти, которая легко доступна для поиска. Вы можете добавить новые переменные / удалить старую и отредактировать имена.

...