2010-02-13 20 views
6

Sadece XML veri kodlamasını taklit eden bir ağaç yapısıyla çalışmak için SSAX-SXML kullanıyorum. Bu yüzden, SXML temsilini doğrudan çalışmak için veri yapısı olarak kullanmayı düşündüm. Her şey çok iyi çalışıyor ve çok yararlı bulduğum varsayılan erişimcilerin ve XPath'in tüm işlevlerini alıyorum.SSAX-SXML ve sayılar

Ama bir sorunum var. XML her şeyi dizgiler olarak gösterir, bu yüzden dizeden sayılara ve viceversa'ya her zaman dönmem gerekir. Bu performans ve sadece kötü bir tasarım fikrini öldürecek. SXML listesini almayı ve tüm dizeleri tek geçişte sayılara dönüştürmeyi düşünüyordum. Ancak, SXML'in bir şeyi doğrudan ya da XML yoluyla söyleyebilmesinin, bir şeyin bir sayı değil, bir dizi olarak gösterilmesi gerektiği bir yolu var mı? Bu (özü) benzeyen bir XML itibaren

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

:

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

teşekkür ederiz

Bu benim SXML listesidir.

+0

Dizgiye dönüştürme işleminin ve genel performansın çok fazla olacağından kuşkuluyum. –

+0

Doğru olabileceğinden ve yanıt alamıyorum, anında dönüşümlerle çalışacağım ve daha sonra tam bir on-pass dönüşüm yapacağım. – alvatar

+0

hala DOM veya VTD-XML'de xpath kullanabilirsiniz ... SXML XML'den daha büyük görünüyor, bu yüzden yavaş olabilir –

cevap

3

SSAX, doğru şekilde yaptığınız gibi XML'in herhangi bir anlamsal bilgi içermediği için, tür dönüştürme için herhangi bir destek yoktur. Tek yapabileceğiniz, özniteliklerinize biraz kısıtlama koymaktır. Ancak SSAX'ın XSD için desteği yoktur. Yani herhangi bir kullanım olmaz.

Ancak, tüm dizeleri sayılara dönüştürmek oldukça basittir, çünkü ayrıştırılmış XML listelerinde depolanır ve listelerle en çok ilgilenen şey listelerle ilgilenir. ;-)

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

Ancak, sisteminizdeki baştaki sıfırları kaybedeceksiniz. Önemli olabilirler.

İlgili konular