Function: xml-parse-string
xml-parse-string is a byte-compiled function defined in xml.el.gz.
Signature
(xml-parse-string)
Documentation
Parse character data at point, and return it as a string.
Leave point at the start of the next thing to parse. This function can modify the buffer by expanding entity and character references.
Source Code
;; Defined in /usr/src/emacs/lisp/xml.el.gz
(defun xml-parse-string ()
"Parse character data at point, and return it as a string.
Leave point at the start of the next thing to parse. This
function can modify the buffer by expanding entity and character
references."
(let ((start (point))
;; Keep track of the size of the rest of the buffer:
(old-remaining-size (- (buffer-size) (point)))
ref val)
(while (and (not (eobp))
(not (looking-at-p "<")))
;; Find the next < or & character.
(skip-chars-forward "^<&")
(when (eq (char-after) ?&)
;; If we find an entity or character reference, expand it.
(unless (looking-at xml-entity-or-char-ref-re)
(error "XML: (Not Well-Formed) Invalid entity reference"))
;; For a character reference, the next entity or character
;; reference must be after the replacement. [4.6] "Numerical
;; character references are expanded immediately when
;; recognized and MUST be treated as character data."
(if (setq ref (match-string 2))
(progn ; Numeric char reference
(setq val (save-match-data
(string-to-number
ref (if (match-string 1) 16))))
(and (null val)
xml-validating-parser
(error "XML: (Validity) Invalid character reference `%s'"
(match-string 0)))
(replace-match (if val (string val) xml-undefined-entity) t t))
;; For an entity reference, search again from the start of
;; the replaced text, since the replacement can contain
;; entity or character references, or markup.
(setq ref (match-string 3)
val (assoc ref xml-entity-alist))
(and (null val)
xml-validating-parser
(error "XML: (Validity) Undefined entity `%s'" ref))
(replace-match (or (cdr val) xml-undefined-entity) t t)
(goto-char (match-beginning 0)))
;; Check for XML bombs.
(and xml-entity-expansion-limit
(> (- (buffer-size) (point))
(+ old-remaining-size xml-entity-expansion-limit))
(error "XML: Entity reference expansion \
surpassed `xml-entity-expansion-limit'"))))
;; [2.11] Clean up line breaks.
(let ((end-marker (point-marker)))
(goto-char start)
(while (re-search-forward "\r\n?" end-marker t)
(replace-match "\n" t t))
(goto-char end-marker)
(buffer-substring start (point)))))