2013-01-16 1 views
1

Le fichier test.yaml .....Comment accéder yaml avec des clés complexes

--- 
    map: 
     ? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl) 
     ? [L, bitsy] : ISO_LOW_BITSY(out, in, ctrl) 
     ? [L, spider] : ISO_LOW_SPIDER(out, in, ctrl) 
     ? [H, ANY] : ISO_HIGH(out, in, ctrl) 

Quelle commande puis-je utiliser pour accéder à une de ces derniers avec YAML-cpp. Je peux accéder à la carte dans son ensemble, mais pas aux éléments individuels.

Voici ce que je suis en train:

YAML::Node doc = YAML::LoadFile("test.yaml"); 
    std::cout << "A:" << doc["mapping"] << std::endl; 
    std::cout << "LS1:" << doc["mapping"]["[L, spider]"] << std::endl; 
    std::cout << "LS2:" << doc["mapping"]["L", "spider"] << std::endl; 

Voici mes résultats:

A:? ? - L 
      - itsy 
: ISO_LOW_ITSY(out, in, ctrl) 
: ~ 
? ? - L 
    - bitsy 
    : ISO_LOW_BITSY(out, in, ctrl) 
: ~ 
? ? - L 
    - spider 
    : ISO_LOW_SPIDER(out, in, ctrl) 
: ~ 
? ? - H 
    - ANY 
    : ISO_HIGH(out, in, ctrl) 
: ~ 
LS1: 
LS2: 

Si ce n'est pas encore possible en YAML-cpp, je voudrais savoir aussi.

Répondre

1

Vous devez définir un type correspondant à votre clé. Par exemple, si votre clé est une séquence de deux scalaires:

struct Key { 
    std::string a, b; 

    Key(std::string A="", std::string B=""): a(A), b(B) {} 

    bool operator==(const Key& rhs) const { 
    return a == rhs.a && b == rhs.b; 
    } 
}; 

namespace YAML { 
    template<> 
    struct convert<Key> { 
    static Node encode(const Key& rhs) { 
     Node node; 
     node.push_back(rhs.a); 
     node.push_back(rhs.b); 
     return node; 
    } 

    static bool decode(const Node& node, Key& rhs) { 
     if(!node.IsSequence() || node.size() != 2) 
     return false; 

     rhs.a = node[0].as<std::string>(); 
     rhs.b = node[1].as<std::string>(); 
     return true; 
    } 
    }; 
} 

Ensuite, si votre fichier YAML est

? [foo, bar] 
: some value 

Vous pouvez écrire:

YAML::Node doc = YAML::LoadFile("test.yaml"); 
std::cout << doc[Key("foo", "bar")];  // prints "some value" 

Note:

Je pense que votre YAML ne fait pas ce que vous vouliez. Dans le contexte de bloc, une paire clé/valeur explicite doit être sur des lignes séparées. En d'autres termes, vous devez faire

? [L, itsy] 
: ISO_LOW_ITSY(out, in, ctrl) 

et pas

? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl) 

Ce dernier il est une clé unique, avec une valeur nulle (implicite); à savoir, il est le même que

? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl) 
: ~ 

(Vous pouvez le voir par la façon dont sorties yaml-cpp votre exemple.) Voir the relevant area in the spec.

Questions connexes