2010-02-13 1 views
6

XML 데이터 인코딩을 모방 한 트리 구조로 작업 할 때 SSAX-SXML을 사용하고 있습니다. 그래서 SXML 표현을 데이터 구조로 직접 사용하여 작업 할 생각이었습니다. 모든 것이 잘 작동하며, 기본 접근 자 및 XPath의 모든 기능을 사용할 수 있습니다.이 기능은 매우 유용한 것으로 나타났습니다.SSAX-SXML 및 숫자

하지만 문제가 있습니다. XML은 모든 것을 문자열로 나타내므로 항상 문자열에서 숫자로 변환해야합니다. 그것은 성능과 단지 나쁜 디자인 아이디어를 죽일 것입니다. 나는 SXML리스트를 가져 와서 모든 문자열을 한 번에 숫자로 변환하려고 생각했다. 그러나 SXML이 XML을 통해 무엇인가가 문자열이 아닌 숫자로 표현되어야한다는 것을 직접적으로 또는 어떤 식 으로든 표현하는 방법이 있습니까? 이 (추출물)처럼 보이는 XML에서

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

감사합니다

이 내 SXML의 목록입니다.

+0

문자열로의 변환과 뒤의 변환이 전반적인 성능과 관련이 있는지 의심 스럽습니다. –

+0

당신이 옳을 수도 있고 응답이 없기 때문에 직접 변환으로 작업 할 것이고 나중에 완전한 온 - 패스 변환을 할 것입니다. – alvatar

+0

DOM 또는 VTD-XML에서 xpath를 계속 사용할 수 있습니다 ... SXML이 XML보다 커서 느려질 수 있습니다. –

답변

3

SSAX에는 XML에 의미 정보가 없음을 올바르게 인식했기 때문에 유형 변환을 지원하지 않습니다. 당신이 할 수있는 일은 당신의 속성에 대한 몇 가지 스키마 제한을 두는 것입니다. 그러나 SSAX는 XSD를 지원하지 않습니다. 그래서 아무 쓸모 없어.

그러나 모든 문자열을 숫자로 변환하는 것은 매우 간단합니다. 구문 분석 된 XML이 목록에 저장되고 목록을 처리하는 것이 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) 

하지만 uid에는 앞자리 0이 없습니다. 그것들은 중요 할 수도 있습니다.