6

私は、XML データ エンコーディングを模倣したツリー構造を操作するために SSAX-SXML を使用しています。そこで、SXML 表現をデータ構造として直接使用することを考えました。すべてが非常にうまく機能し、デフォルトのアクセサーと XPath のすべての機能を利用できるので、非常に便利です。

しかし、私には問題があります。XML はすべてを文字列として表すため、常に文字列から数値へ、またはその逆に変換する必要があります。それはパフォーマンスを低下させ、設計上のアイデアを悪くします。SXML リストを取得して、すべての文字列を 1 回のパスで数値に変換することを考えていました。しかし、SXML がそれを直接行う方法や、何かを文字列ではなく数値として表す必要があることを XML 経由で伝える方法はありますか?

これは私の 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"))))

次のような XML から (抜粋):

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

ありがとうございました。

4

1 に答える 1

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 の先行ゼロが失われます。それらは重要かもしれません。

于 2011-12-09T23:49:11.990 に答える