gpt4 book ai didi

xml - 如何使用 Closure XML 将元素注入(inject)字符内容?

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:43 25 4
gpt4 key购买 nike

我需要转换所有字符 |标记一个大 XML 文件的所有文本 block 。也就是说,每当我发现

<test att="one|two">content | something more | and done</test>

我需要转换成

<test att="one|two">content <bar/> something more <bar/> and done</test>

请注意 |也可以出现在属性值中,在这种情况下,它们必须保持不变。看完Transforming CXML 重点的 SAX 概述部分的幻灯片,我写了

(defclass preproc (cxml:sax-proxy) ())

(defmethod sax:characters ((handler preproc) data)
(call-next-method handler (cl-ppcre:regex-replace "\\|" data "<bar/>")))

当然,它会在最终 XML 中生成一个字符串(转义)而不是标记。

WML> (cxml:parse "<test>content | ola</test>"
(make-instance 'preproc
:chained-handler (cxml:make-string-sink)))
<?xml version="1.0" encoding="UTF-8"?>
<test>content &lt;bar/&gt; ola</test>"

有什么想法或方向吗?

最佳答案

处理程序不调用解析器,但处理已经解析的值。因此,与其构建包含 string,不如调用在 确实遇到过。在这种情况下,如果文档实际上有

content <bar/> ola

test 元素中,然后会有调用:

(sax:characters handler "content ")
(sax:start-element handler nil nil "bar" '())
(sax:end-element handler nil nil "bar"
(sax:characters handler " ola")

因此,您需要做的就是在 | 字符处拆分字符串(如果需要,您可以使用 CL-PPCRE,尽管可能有更轻量级的解决方案),然后执行为每个字符串部分调用 call-next-method,并在两者之间调用 sax:start-elementsax:end-element:

(defmethod sax:characters ((handler preproc) data)
(let ((parts (cl-ppcre:split "\\|" data)))
;; check this on edge cases, though, e.g., "", "|", "a|", strings
;; without any "|", etc.
(call-next-method handler (pop parts))
(dolist (part parts)
(sax:start-element handler nil nil "bar" '())
(sax:end-element handler nil nil "bar")
(call-next-method handler part))))

(cxml:parse "<test>content | ola</test>"
(make-instance 'preproc
:chained-handler (cxml:make-string-sink)))
;=>
; "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
; <test>content <bar/> ola</test>"

关于xml - 如何使用 Closure XML 将元素注入(inject)字符内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26714660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com