代码之家  ›  专栏  ›  技术社区  ›  alvatar

SSAX-SXML和数字

  •  6
  • alvatar  · 技术社区  · 15 年前

    我使用SSAX-SXML来处理一个只模仿XML数据编码的树结构。所以我考虑直接使用SXML表示作为数据结构来使用。一切都很好地工作,我得到了默认访问器和xpath的所有功能,我发现它们非常有用。

    但我有个问题。XML将所有内容都表示为字符串,因此我需要始终将字符串转换为数字和viceversa。这将扼杀性能,只是一个糟糕的设计理念。我正在考虑采用SXML列表,并一次性将所有字符串转换为数字。但是,有没有一种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>
    

    谢谢您。

    1 回复  |  直到 15 年前
        1
  •  3
  •   ceving    13 年前

    SSAX不支持任何类型转换,因为正如您正确注意到的,XML缺少任何语义信息。您所能做的就是在您的属性上放置一些方案约束。但是SSAX不支持XSD。所以它没有任何用处。

    但是将所有字符串转换为数字非常简单,因为解析后的XML存储在列表中,处理列表是方案中最自然的事情。;-)

    (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上去掉前导零。它们可能很重要。