Получите все аргументы, указанные после флага, Boost Program Options [duplicate]

Вы можете использовать объект PowerShell [xml] и установить $xml.PreserveWhitespace = $true или сделать то же самое с помощью .NET XmlDocument:

$f = '.\xml_test.xml'

# Using .NET XmlDocument
$xml = New-Object System.Xml.XmlDocument
$xml.PreserveWhitespace = $true

# Or using PS [xml] (older PowerShell versions may need to use psbase)
$xml = New-Object xml
#$xml.psbase.PreserveWhitespace = $true  # Older PS versions
$xml.PreserveWhitespace = $true

# Load with preserve setting
$xml.Load($f)
$n = $xml.SelectSingleNode('//file')
$n.InnerText = 'b'
$xml.Save($f)

Просто установите PreserveWhitespace ] перед вызовом XmlDocument.Load или XmlDocument.LoadXml.

ПРИМЕЧАНИЕ. Это не сохраняет пробел между атрибутами XML! Белое пространство в XML-атрибуты, похоже, сохраняются, но не между . В документации говорится о сохранении «узлов белого пространства» (node.NodeType = System.Xml.XmlNodeType.Whitespace), а не атрибутов.

2
задан DerAuenlaender 1 February 2016 в 15:52
поделиться

1 ответ

Это может быть сделано без большого количества дополнительного кода. Секрет состоит в том, чтобы отделить шаг синтаксического анализа от этапа хранения, также как и в этом ответе .

Парсер вернет контейнер структур key / value при представлении опций от пользователя. Если параметр передается несколько раз, тогда у контейнера будет отдельная запись для каждой подачи параметра.

Вот пример, который выводит каждую опцию ввода нескольких токенов на отдельной строке:

#include <iostream>
#include <string>
#include <vector>

#include <boost/program_options.hpp>

namespace po = boost::program_options;

int main(int argc, char *argv[]) {
   // Define a multi-token option.
   po::options_description desc("Allowed options");
   desc.add_options()
      ("list", po::value<std::vector<std::string>>()->multitoken(), "multiple values");

   // Just parse the options without storing them in a map.
   po::parsed_options parsed_options = po::command_line_parser(argc, argv)
      .options(desc)
      .run();

   // Build list of multi-valued option instances. We iterate through
   // each command-line option, whether it is repeated or not. We
   // accumulate the values for our multi-valued option in a
   // container.
   std::vector<std::vector<std::string>> lists;
   for (const po::option& o : parsed_options.options) {
      if (o.string_key == "list")
         lists.push_back(o.value);
   }

   // If we had other normal options, we would store them in a map
   // here. In this demo program it isn't really necessary because
   // we are only interested in our special multi-valued option.
   po::variables_map vm;
   po::store(parsed_options, vm);

   // Print out the multi-valued option, each separate instance on its
   // own line.
   for (size_t i = 0; i < lists.size(); ++i) {
      for (size_t j = 0; j < lists[i].size(); ++j)
         std::cout << lists[i][j] << ' ';
      std::cout << '\n';
   }

   return 0;
}

И вот пример вызова ( live at coliru ):

$ ./po --list 1 2 3 --list foo bar --list how now brown cow
1 2 3 
foo bar 
how now brown cow 
4
ответ дан Community 17 August 2018 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: