2010-02-13 2 views
6

Sto usando SSAX-SXML per lavorare con una struttura ad albero che imita solo la codifica dei dati XML. Quindi ho pensato di utilizzare la rappresentazione SXML direttamente come la struttura dati con cui lavorare. Tutto funziona molto bene e ottengo tutte le funzionalità degli accessor predefiniti e XPath, che ho trovato molto utile.SSAX-SXML e numeri

Ma ho un problema. XML rappresenta tutto come stringhe, quindi ho bisogno di convertire da stringa a numeri e viceversa, tutto il tempo. Questo ucciderà le prestazioni e solo una cattiva idea di design. Stavo pensando di prendere l'elenco SXML e trasformare tutte le stringhe in numeri in un unico passaggio. Ma esiste un modo in cui SXML esegue direttamente questo o qualsiasi modo per dire via XML che qualcosa dovrebbe essere rappresentato come un numero, non una stringa?

Questa è la mia lista SXML:

((wall (@ (uid "2387058723")) 
    (pt (@ (y "2.0") (x "1.0"))) 
    (pt (@ (y "4.0") (x "3.0")))) 
(wall (@ (uid "5493820876")) 
    (pt (@ (y "0.0") (x "0.0"))) 
    (pt (@ (y "100.0") (x "0.0"))) 
    (window (@ (to "0.4") (from "0.2"))) 
    (window (@ (size "1.0") (from "0.2"))) 
    (door (@ (size "1.0") (from "0.2")))) 
(pilar (@ (uid "692034802")) 
    (center (@ (y "5.0") (x "5.0"))) 
    (dim (@ (b "0.45") (a "0.3")))) 
(room (@ (label "salon")) 
    (wall (@ (uid "2387058723"))) 
    (wall (@ (uid "5493820876"))) 
    (wall (@ (uid "5394501263"))) 
    (wall (@ (uid "0034923049")))) 
(entry (@ (doorNumber "0")) (wall (@ (uid "5493820876")))) 
(num "0,9") 
(pipe (@ (y "8.0") (x "10.0")))) 

Da un XML che assomiglia a questo (estratto):

 <wall uid="2387058723"> 
      <pt x="1.0" y="2.0"/> 
      <pt x="3.0" y="4.0"/> 
     </wall> 

Grazie.

+0

Dubito che la conversione in stringa e ritorno avrà molto a che fare con le prestazioni generali. –

+0

Come potresti avere ragione, e non ricevo risposte, lavorerò con le conversioni al volo e in seguito eseguirò una conversione completa in transito. – alvatar

+0

puoi ancora usare xpath su DOM o VTD-XML ... SXML sembra più grande di XML, quindi potrebbe essere lento –

risposta

3

SSAX non ha alcun supporto per la conversione dei tipi, perché come avete notato correttamente XML manca qualsiasi informazione semantica. Tutto quello che puoi fare è mettere alcuni vincoli di schema sui tuoi attributi. Ma SSAX non ha supporto per XSD. Quindi non sarebbe di alcuna utilità.

Ma la conversione di tutte le stringhe in numeri è piuttosto semplice, poiché l'XML analizzato è memorizzato in elenchi e la gestione degli elenchi è la cosa più naturale in Scheme. ;-)

(define example '((wall (@ (uid "1")) 
         (pt (@ (x "1.0") (y "2.0"))) 
         (pt (@ (x "3.0") (y "4.0")))))) 

(define (ssax:string->number ssax) 
    (if (string? ssax) 
     (string->number ssax) 
     (if (list? ssax) 
      (map ssax:string->number ssax) 
      ssax))) 

(ssax:string->number example) 

Ma perderete gli zeri iniziali dei vostri uid. Potrebbero essere significativi.