首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用闭包XML将元素注入到字符内容中?

如何使用闭包XML将元素注入到字符内容中?
EN

Stack Overflow用户
提问于 2014-11-03 20:44:51
回答 1查看 89关注 0票数 1

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

代码语言:javascript
复制
<test att="one|two">content | something more | and done</test>

我需要转变为

代码语言:javascript
复制
<test att="one|two">content <bar/> something more <bar/> and done</test>

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

代码语言:javascript
复制
(defclass preproc (cxml:sax-proxy) ())

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

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

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

有什么想法或方向吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-03 22:01:55

处理程序不调用解析器,但正在处理已解析的值。因此,您要做的不是构造一个包含的字符串,而是调用如果实际遇到就会调用的方法。在这种情况下,如果文档实际上有

代码语言:javascript
复制
content <bar/> ola

测试元素中,会有这样的调用:

代码语言:javascript
复制
(sax:characters handler "content ")
(sax:start-element handler nil nil "bar" '())
(sax:end-element handler nil nil "bar"
(sax:characters handler " ola")

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

代码语言:javascript
复制
(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))))

代码语言:javascript
复制
(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>"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26714660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档