2010-02-13 6 views
6

Ich benutze SSAX-SXML für die Arbeit mit einer Baumstruktur, die nur die XML-Datencodierung nachahmt. Also dachte ich daran, die SXML-Darstellung direkt als Datenstruktur zu verwenden. Alles funktioniert sehr gut, und ich bekomme alle Funktionen von Standard Accessoren und XPath, die ich sehr nützlich fand.SSAX-SXML und Zahlen

Aber ich habe ein Problem. XML stellt alles als Zeichenfolgen dar, also muss ich die ganze Zeit von String zu Zahlen und umgekehrt konvertieren. Das wird Leistung und nur eine schlechte Design-Idee töten. Ich dachte daran, die SXML-Liste zu übernehmen und alle Strings in einem Durchgang in Zahlen umzuwandeln. Aber gibt es einen Weg, auf dem SXML direkt oder über XML sagt, dass etwas als Zahl und nicht als String dargestellt werden sollte?

Dies ist meine SXML Liste:

((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")))) 

Aus einem XML-Code, wie dieser (Auszug) aussieht:

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

Danke.

+0

Ich bezweifle die Umwandlung in String und zurück wird viel mit der Gesamtleistung zu tun haben. –

+0

Da Sie vielleicht Recht haben und keine Antworten erhalten, arbeite ich mit On-The-Fly-Conversions, und später mache ich eine vollständige On-Pass-Conversion. – alvatar

+0

können Sie immer noch Xpath auf DOM oder VTD-XML verwenden ... SXML sieht größer aus als XML, also könnte es langsam sein –

Antwort

3

SSAX unterstützt keine Typkonvertierung, weil, wie Sie richtig bemerkt haben, XML keine semantischen Informationen enthält. Alles, was Sie tun können, ist einige Schemaeinschränkungen auf Ihre Attribute zu setzen. Aber SSAX unterstützt keine XSD. Es würde also nichts nützen.

Die Konvertierung aller Strings in Zahlen ist jedoch ziemlich einfach, da das geparste XML in Listen gespeichert ist und der Umgang mit Listen die natürlichste Sache in Scheme ist. ;-)

(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) 

Aber Sie werden die führenden Nullen auf Ihren Uids verlieren. Sie könnten signifikant sein.