2010-02-13 42 views
6

मैं एक पेड़ संरचना के साथ काम करने के लिए एसएसएक्स-एसएक्सएमएल का उपयोग कर रहा हूं जो सिर्फ एक्सएमएल डेटा एन्कोडिंग की नकल करता है। इसलिए मैंने एसएक्सएमएल प्रतिनिधित्व का उपयोग सीधे डेटा संरचना के साथ काम करने के बारे में सोचा। सबकुछ बहुत अच्छी तरह से काम करता है, और मुझे डिफ़ॉल्ट एक्सेसर्स और XPath की सभी कार्यक्षमता मिलती है, जिन्हें मैंने बहुत उपयोगी पाया।एसएसएक्स-एसएक्सएमएल और संख्या

लेकिन मुझे कोई समस्या है। एक्सएमएल स्ट्रिंग्स के रूप में सबकुछ का प्रतिनिधित्व करता है, इसलिए मुझे हर समय स्ट्रिंग से संख्याओं और उपाध्यक्षों में कनवर्ट करने की आवश्यकता है। वह प्रदर्शन को मार देगा और सिर्फ एक खराब डिजाइन विचार होगा। मैं एसएक्सएमएल सूची लेने और सभी तारों को एक पास में संख्याओं में बदलने की सोच रहा था। लेकिन, क्या ऐसा कोई तरीका है कि एसएक्सएमएल सीधे ऐसा करता है या एक्सएमएल के माध्यम से बताने का कोई तरीका है कि कुछ को एक संख्या के रूप में प्रदर्शित किया जाना चाहिए, स्ट्रिंग नहीं?

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

आप अभी भी डीओएम या वीटीडी-एक्सएमएल पर एक्सपैथ का उपयोग कर सकते हैं ... एसएक्सएमएल एक्सएमएल से बड़ा दिखता है, इसलिए यह धीमा हो सकता है –

उत्तर

3

एसएसएक्स के पास प्रकार रूपांतरण करने का कोई समर्थन नहीं है, क्योंकि आपने सही ढंग से ध्यान दिया है कि एक्सएमएल में कोई अर्थपूर्ण जानकारी नहीं है। आप जो कुछ भी कर सकते हैं वह आपके गुणों पर कुछ योजना बाधा डाल रहा है। लेकिन एसएसएक्स के पास एक्सएसडी के लिए कोई समर्थन नहीं है। तो यह किसी भी उपयोग का नहीं होगा।

लेकिन सभी स्ट्रिंग्स को संख्याओं में कनवर्ट करना काफी सरल है, क्योंकि पार्स किए गए एक्सएमएल सूचियों में संग्रहीत हैं और सूचियों से निपटना योजना में सबसे स्वाभाविक बात है। ;-)

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

लेकिन आप अपने यूड्स पर अग्रणी शून्य खो देंगे। वे महत्वपूर्ण हो सकते हैं।

संबंधित मुद्दे