Qual è una buona strategia per leggere XML come dati di testo gerarchici?

0

Voglio leggere i dati in un formato come il seguente usando Java.

 [scenario]
     id=my_first_scenario
     next_scenario=null
     name=_"My First Scenario."
     map_data="{~add-ons/my_first_campaign/maps/my_first_map.map}"
     turns=30
     [side]
         side=1
         controller=human
         team_name="good"
         user_team_name= _ "My Team"
         id=MyLeader
         name= _ "My Leader's Name"
         type="Elvish Ranger"
         unrenameable=yes
         canrecruit=yes
         recruit="Elvish Fighter, Elvish Archer, Elvish Shaman"
         gold=100
     [/side]
     [side]
        side=2
        controller=ai
        team_name="bad"
        user_team_name= _ "Bad Guys"
        id="EnemyLeader"
        name= _ "My Villain"
        type= "Orcish Warrior"
        unrenameable=yes
        canrecruit=yes
        recruit="Orcish Grunt, Orcish Archer, Orcish Assassin, Wolf Rider"
        gold=100
     [/side]
 [/scenario]

Voglio sviluppare un'API che possa leggere tale contenuto in modo generico, ad esempio, con metodi come getChildren , getAttributes . Mi chiedo se ci siano librerie che supportano questo tipo di attività.

Di seguito sono ciò che ho trovato,

  • Poiché si tratta di un linguaggio semplice (come XML), dovrei usare una libreria come antlr? O è troppo complesso per questo compito?

  • Devo usare regex per analizzare questi dati?

  • Devo elaborare il testo manualmente come uno stream e identificare i tag / attributi mentre arrivano?

  • O c'è un modo migliore / diverso rispetto a tutti sopra?

Per chiunque sia interessato, questo linguaggio di markup viene utilizzato in un gioco chiamato Battle for Wesnoth , che è in c ++. Voglio analizzare questi dati utilizzando Java.

    
posta Can't Tell 25.10.2016 - 08:16
fonte

3 risposte

4

Il gioco è un software open source, quindi è necessario scaricare il codice sorgente, individuare il codice che lo analizza e portarlo da C ++ a Java o aggiungere un componente C ++ al progetto in qualche modo. Probabilmente quest'ultimo sarebbe preferibile, perché ti permetterebbe di incorporare facilmente gli aggiornamenti dal gioco se cambiano o estendono il loro linguaggio di marcatura.

Molto probabilmente sarà molto più facile che provare a scrivere il tuo parser. Sembra un linguaggio di markup personalizzato molto complesso, basato sui loro documenti.

Inoltre, sarebbe probabilmente utile contattare il team di sviluppo del gioco e ottenere un feedback sulla tua idea. Potrebbe essere qualcosa a cui sono interessati o almeno avere qualche consiglio su come procedere.

Aggiornamento: probabilmente non puoi evitare di analizzare l'intera sintassi perché stai facendo qualcosa di "semplice".

Supponiamo di voler solo catturare tutti i casi di type=[value] . Sembra semplice, giusto? Sfortunatamente no. L'utente può definire una macro in questo modo:

#define OOPS_YOUR_CODE_BROKE X
[unit]
    type=X
[/unit]
#enddef

{OOPS_YOUR_CODE_BROKE 23}

Questo è l'equivalente di:

[unit]
    type=23
[/unit]

Quindi anche la cattura più semplice dovrà comprendere l'intera sintassi, se vuoi che sia completamente corretta.

    
risposta data 25.10.2016 - 08:31
fonte
1

Scriverò semplicemente il mio parser considerando che ci sono essenzialmente solo due (tre) possibili casi identificati dal primo carattere non di spazi vuoti in una riga:

  • Se si tratta di una parentesi, creane una nuova e rendila attuale o torna al genitore.
  • Se si tratta di una lettera, leggi l'attributo per il nodo corrente.

Utilizza anche solo l'analisi del testo non elaborato. Usare le espressioni regolari sarebbe un sovraccarico per un guadagno molto basso IMO.

    
risposta data 25.10.2016 - 08:24
fonte
-1

Questo formato è simile a YAML. Considerare la conversione in YAML usando un'espressione regolare e utilizzando un parser YAML standard. Dovrai codificare il testo traducibile denotato da un carattere di sottolineatura e da ID (letterali di testo non quotati).

Scopri YAML

    
risposta data 25.10.2016 - 13:12
fonte

Leggi altre domande sui tag