2011-12-15 3 views
3

Итак, вот пример структуры XML:C++ увеличить Property Tree Обновление существующего узла по атрибутам Qualifier

<config> 
    <Ignored> 
    <Ignore name="Test A"> 
     <Criteria> 
      <value>actual value</value> 
     </Criteria> 
    </Ignore> 
    <Ignore name="Test B"> 
     <Criteria> 
      <value>actual value</value> 
     </Criteria> 
    </Ignore> 
    </Ignored> 
<config> 

Я хотел бы быть в состоянии сделать две вещи:

  1. выполнить получить непосредственно элемент Test A, не зацикливая все элементы Ignore ... как селектор атрибута.
  2. Если ничего другого, мне нужен способ обновления либо из элементов Игнорировать и не могу понять это

Должен ли я удалить элемент и создать его заново? Кажется, я не могу найти способ выполнить put, который квалифицирует элемент (там, где много с тем же именем на том же уровне) с помощью атрибута (который был бы уникальным на этом уровне).

Что-то вроде:

pt.put("config.Ignored.Ignore.<xmlattr>.name='Test A'.Criteria.value",some_var) 

Или что-нибудь другое, что может достичь конечной цели. Большое спасибо!

Полное раскрытие информации: Я довольно новичок в C++ и, возможно, отсутствует что-то явно очевидное.

+0

Есть ли веская причина, по которой вы используете дерево свойств boost? Возможно, вам лучше использовать реальную библиотеку XML. –

+0

Честно? Нет, я не могу сказать, что у меня есть веская причина. Мне посчастливилось подтолкнуть и подумать, что я попытаюсь использовать то, что там было, и все получилось прекрасно. Не дойдя до этой проблемы. Если бы вы порекомендовали настоящую библиотеку XML, что бы это было? – CapersL

+0

Я бы порекомендовал tinyxml и libxml2 (в зависимости от ваших потребностей). –

ответ

4

Boost.property_tree xml parser (RapidXML) не поддерживает это.
Подумайте, используя что-то вроде TinyXPath, вы хотите, чтобы такая функциональность была из коробки.

Или используйте явный цикл, чтобы найти узел Ignore с обязательным атрибутом. Тогда вы можете использовать

someIgnoreNode.put("Criteria.value", some_var); 
+0

Спасибо. Это то, что я пытался сделать, когда я разместил вопрос, я думаю, что я что-то упустил. 'BOOST_FOREACH (const ptree :: value_type & v2, pt.get_child (" config.Ignored ")) { if (_stricmp (cText, v2.second.get (" .name "," "). C_str()) == 0) { \t BOOST_FOREACH (Const Ptree :: value_type & v3, v2.second) { \t \t, если (v3.first == "Критерии") { \t \t \t v3.second.put ("значение ", szValue); \t \t} \t} } ' Но я получаю эту ошибку: ' не может преобразовать 'это' указатель из 'сопзЬ повышающего :: property_tree :: basic_ptree ' на 'повышение :: property_tree :: basic_ptree &' \t ' Как я уже сказал, это, наверное, что-то глупое. – CapersL

+0

Ну, это не совсем правильно. – CapersL

+0

@CapersL, вы пытаетесь изменить объект 'const' - удалите' const' из типов 'v3' и' v2' – Abyx

Смежные вопросы