SSAX-SXML и цифры - PullRequest
       18

SSAX-SXML и цифры

6 голосов
/ 13 февраля 2010

Я использую SSAX-SXML для работы с древовидной структурой, которая просто имитирует кодировку данных XML. Поэтому я подумал об использовании представления SXML непосредственно в качестве структуры данных для работы. Все работает очень хорошо, и я получаю все функциональные возможности по умолчанию аксессоров и XPath, которые я нашел очень полезными.

Но у меня есть проблема. XML представляет все как строки, поэтому мне нужно постоянно преобразовывать строки в числа и наоборот. Это убьет производительность и просто плохую дизайнерскую идею. Я думал о том, чтобы взять список 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 Ответ

3 голосов
/ 10 декабря 2011

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)

Но вы потеряете ведущие нули на ваших идентификаторах. Они могут быть значительными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...