2010-08-19 2 views
4

Je suis très excité de commencer mon voyage erlang, mais je suis bloqué depuis quelques jours et je commence à avoir peur de ne pas respecter mon délai. J'essaie de créer une clé, des paires de valeurs de xml. J'aimerais faire une liste de tout fichier XML imbriqué. Cela semble être une chose très courante, mais je ne trouve aucun exemple.Erlang xml aux tuples et listes

Par exemple:

<something> 
     <Item> 
      <name>The Name!</name> 
      <reviews> 
        <review> 
         <review-by>WE</review-by> 
         <review-points>92</review-points> 
        </review> 

        <review> 
         <review-by>WS</review-by> 
         <review-points>90</review-points> 
        </review> 
      </reviews> 
     </Item> 
    </something> 

Si tourner comme:

chaque élément est le principal nœud d'emballage.

J'ai certes reconnu la cargaison et modifié le code ci-dessous. Il renvoie uniquement une liste des éléments du premier élément. Et je ne suis pas sûr de savoir comment commencer les imbriqués.

Merci beaucoup!

-module(reader). 
    -compile(export_all). 
    -include_lib("xmerl/include/xmerl.hrl"). 

    parse(FileName) -> 
     {Records,_} = xmerl_scan:file(FileName), 
     extract(Records, []). 

    extract(Record, Acc) when is_record(Record, xmlElement) -> 
     case Record#xmlElement.name of 
      'Item' -> 
       ItemData = lists:foldl(fun extract/2, [], Record#xmlElement.content), 
       [ {item, ItemData} | Acc ]; 
      _ -> 
       lists:foldl(fun extract/2, Acc, Record#xmlElement.content) 
     end; 

    extract({xmlText, [{Attribute, _}, {'Item', 2}, _], _, _, Value, text}, Acc) -> 
     [{Attribute, Value}|Acc]; 

    extract(_, Acc) -> 
     Acc. 

Répondre

5

Donner Erlsom Essayez. La fonction « erlsom: simple_form (XML) » vous donnera {Node, Attrib, valeur}:

{"something",[], 
[{"Item",[], 
    [{"name",[],["The Name!"]}, 
    {"reviews",[], 
    [{"review",[], 
     [{"review-by",[],["WE"]},{"review-points",[],["92"]}]}, 
     {"review",[], 
     [{"review-by",[],["WS"]},{"review-points",[],["90"]}]}]}]}]} 

Cependant, si vous voulez déposer les attributs, alors vous pouvez écrire un plaisir de passer à l'analyseur SAX erlsom ou reformatez la sortie de simple_form. Quelque chose comme ça (à reformater sortie):

-module(reader). 
-compile(export_all). 

convert(XML)-> 
    case erlsom:simple_form(XML) of 
     {ok,{Node,_Attrib,Value},_}-> 
      {Node,xml_to_kv(Value)}; 
     Err-> 
      Err 
    end. 


xml_to_kv([{Node,_Attrib,Value}|T])-> 
    [{Node,lists:flatten(xml_to_kv(Value))}|xml_to_kv(T)]; 

xml_to_kv(Value)-> 
    Value. 

Ceci produirait la sortie suivante:

{"something", 
[{"Item", 
    [{"name","The Name!"}, 
    {"reviews", 
    [{"review",[{"review-by","WE"},{"review-points","92"}]}, 
     {"review",[{"review-by","WS"},{"review-points","90"}]}]}]}]} 

Remarque, je ne l'ai pas testé sur des fichiers XML très volumineux. Vous devriez exécuter quelques tests et considérer les problèmes de mem.

Questions connexes