Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-10-25

KMRCLを眺める(221) POSITIONS-XML-TAG-CONTENTS

| 20:40 | KMRCLを眺める(221) POSITIONS-XML-TAG-CONTENTS - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(221) POSITIONS-XML-TAG-CONTENTS - わだばLisperになる

今回はKMRCLのxml-utils.lispから、POSITIONS-XML-TAG-CONTENTSです。

定義は、

(defun positions-xml-tag-contents (tag xmlstr &optional (start-xmlstr 0)
                                       (end-xmlstr (length xmlstr)))
  "Returns three values: the start and end positions of contents between
 the xml tags and the position following the close of the end tag."
  (let* ((taglen (length tag)))
    (multiple-value-bind (start attributes)
        (find-start-tag tag taglen xmlstr start-xmlstr end-xmlstr)
      (unless start
        (return-from positions-xml-tag-contents (values nil nil nil nil)))
      (let ((end (find-end-tag tag taglen xmlstr start end-xmlstr)))
        (unless end
          (return-from positions-xml-tag-contents (values nil nil nil nil)))
        (values start end (+ end taglen 3) attributes)))))

となっていますが、前回、前々回に眺めた、FIND-START-TAG、FIND-END-TAGを使ってタグに囲まれた中身の開始と終了の位置を切り出している様子。

最初に開始タグの検出、不備があれば脱出、次に終了タグの検出/脱出、開始/終了タグともに問題なければ位置を多値で返す、という風。

動作は、

(kl::positions-xml-tag-contents "foo" "<foo bar=\"1\">hello</foo>")
;⇒ 13, 18, 24, ("bar=\"1\"")

;; 開始タグ不備
(kl::positions-xml-tag-contents "foo" "foo>hello</foo>")
;⇒ NIL, NIL, NIL, NIL

;; 終了タグ不備
(kl::positions-xml-tag-contents "foo" "<foo>hello</foo")
;⇒ NIL, NIL, NIL, NIL

となっています。