我正在使用SSAX-SXML来处理模仿XML数据编码的树结构.所以我想到直接使用SXML表示作为数据结构来使用.一切都很好,我得到了默认访问器和XPath的所有功能,我发现它非常有用.
但我有一个问题.XML将所有内容都表示为字符串,因此我需要始终将字符串转换为数字,反之亦然.这将扼杀性能,只是一个糟糕的设计理念.我正在考虑使用SXML列表并在一次传递中将所有字符串转换为数字.但是,有没有一种方法可以让SXML直接通过XML或任何方式通过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"))))
Run Code Online (Sandbox Code Playgroud)
从看起来像这样的XML(提取):
<wall uid="2387058723">
<pt x="1.0" y="2.0"/>
<pt x="3.0" y="4.0"/>
</wall>
Run Code Online (Sandbox Code Playgroud)
谢谢.
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)
Run Code Online (Sandbox Code Playgroud)
但是你的 uid 上会丢失前导零。它们可能很重要。
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |