이맥스에서 순수 Elisp XML 파서 포함 xml.el
그, xml-parse-string
그것을 문서화되지 않은 내부 함수처럼 조금 보이지만, 함수 작업을 수행합니다. 문자열을 XML 조각으로 취급하여 제대로 처리되지 않는 HTML 전용 엔터티가 있는지 확실하지 않습니다.
이 래퍼 함수는 입력 문자열에서 후행 태그를 생략하지만 더 엄격하게 만들 수 있습니다.
(defun decode-entities (html)
(with-temp-buffer
(save-excursion (insert html))
(xml-parse-string)))
(decode-entities "The old "how to fold xml" question")
;; => "The old \"how to fold xml\" question"
(decode-entities "doesn't")
;; => "doesn't"
(decode-entities "string with trailing tag: <tag/>")
;; => "string with trailing tag: "
LibXML을 지원하는 Emacs에서 또 다른 약간의 해킹 방법은 래퍼를 작성하는 것 libxml-html-parse-region
입니다. LibXML 구문 분석기는 해당 인수가 완전한 HTML 문서라고 가정하므로 랩퍼 함수는를 사용하여 리턴 된 문서 구조에서 구문 분석 된 문자 데이터를 추출해야합니다 pcase
. HTML 태그가 포함 된 문자열을 디코딩하려고하면 오류가 발생합니다.
(defun decode-entities/libxml (html)
(with-temp-buffer
(insert html)
(let ((document
(libxml-parse-html-region (point-min) (point-max))))
(pcase document
(`(html nil
(body nil
(p nil
,(and (pred stringp)
content))))
content)
(_ (error "Unexpected parse result: %S" document))))))
결과 :
(decode-entities/libxml "The old "how to fold xml" question")
; => "The old \"how to fold xml\" question"
(decode-entities/libxml "doesn't") ; => "doesn't"
(decode-entities/libxml "<html>") ; produces an error
문서 조각을 완전한 문서로 구문 분석하여 주변 조각을 즉시 제거하기 위해 문서 조각을 해독하는 것은 약간 뒤 떨어진 것처럼 보입니다. 반면에 LibXML을 사용하면 빠르고 정확한 결과를 얻을 수 있습니다.