Racket输出到XML文件

时间:2014-05-13 12:09:30

标签: xml racket

我有一对配对列表,如下所示:

((IDENTIFRIAR . str) (SYMBOL . =) (STRING-CONSTANT .  Hello world! ) (BOOLEAN-CONSTANT . true))

我想生成并输出为xml,如:

<elements>
    <IDENTIFRIAR>str<IDENTIFRIAR/>
    <SYMBOL>=<SYMBOL/>
    <STRING-CONSTANT> Hello world!<STRING-CONSTANT/>
    <BOOLEAN-CONSTANT>true<BOOLEAN-CONSTANT/>
<elements/>

我该怎么办?我发现自己正在查看XML和xexpr的一些长文档,而不了解我如何实际创建,追加和更改XML实体。

1 个答案:

答案 0 :(得分:1)

首先,让我们清理您的输入。你有例如:

'(STRING-CONSTANT . Hello world!)

无效。

而是让我们创建一个值为的关联列表 字符串,并将其用作输入:

(define alist '((IDENTIFRIAR . "str")
                (SYMBOL . "=")
                (STRING-CONSTANT . "Hello world!" )
                (BOOLEAN-CONSTANT . "true")))

让我们将其转换为x-expr,这是一种表达方式 XML作为s表达式。

(define xexprs (for/list ([a (in-list alist)])
                 (match-define (cons k v) a)
                 `(,k () ,v)))
;; =>
;; '((IDENTIFRIAR () "str")
;;   (SYMBOL () "=")
;;   (STRING-CONSTANT () "Hello world!")
;;   (BOOLEAN-CONSTANT () "true"))

现在让我们使用来自Racket的xml集合的xexpr->string进行转换。

(require xml)
(xexpr->string `(elements () ,@xexprs))
;; =>
;; "<elements><IDENTIFRIAR>str</IDENTIFRIAR><SYMBOL>=</SYMBOL><STRING-CONSTANT>Hello world!</STRING-CONSTANT><BOOLEAN-CONSTANT>true</BOOLEAN-CONSTANT></elements>"

如果你想缩进,那么:

(display-xml/content (xexpr->xml `(elements () ,@xexprs)))

显示:

<elements>
  <IDENTIFRIAR>
    str
  </IDENTIFRIAR>
  <SYMBOL>
    =
  </SYMBOL>
  <STRING-CONSTANT>
    Hello world!
  </STRING-CONSTANT>
  <BOOLEAN-CONSTANT>
    true
  </BOOLEAN-CONSTANT>
</elements>