Обновление дерева свойств C ++ Boost для существующего узла по квалификатору атрибута - PullRequest
4 голосов
/ 15 декабря 2011

Хорошо, вот пример структуры XML:

<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. Если ничего другого, мне нужен метод обновления любого из элементов Ignore, и я не могу понять это

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

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

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

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

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

1 Ответ

5 голосов
/ 15 декабря 2011

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

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

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