我有一对配对列表,如下所示:
((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实体。
答案 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>