I have a file with xml all on one line. Does the functionality already exist to reformat this buffer to be somewhat user-readable?
-
4FWIW this question was asked on stackoverflow: stackoverflow.com/questions/12492/…YoungFrog– YoungFrog2015-07-23 21:06:54 +00:00Commented Jul 23, 2015 at 21:06
-
I like this answer stackoverflow.com/a/570049/8583496Alexey Shrub– Alexey Shrub2022-02-19 20:32:58 +00:00Commented Feb 19, 2022 at 20:32
6 Answers
Does the functionality already exist to reformat this buffer to be somewhat user-readable?
Of course, and you have plenty of options. I'd probably feed it to an external program using:
C-x h C-u M-| xmllint --format - RET
This program comes with libxml2. You could also use tidy. Here's a list of commandline xml formatting tools: https://stackoverflow.com/questions/16090869/how-to-pretty-print-xml-from-the-command-line
You could also do a search and replace and then indent:
M-% > < RET > C-q C-j < RET ! C-M-\
Neat trick: you can copy and paste the above string into M-: (eval-expression) like this:
(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
-
A nice answer, but be wary that the command as written now will replace the buffer content with the output from the shell command. This is because of the
C-uprefix.FredrikHedman– FredrikHedman2017-03-04 14:30:46 +00:00Commented Mar 4, 2017 at 14:30
The built-in sgml-mode has a command to do this: sgml-pretty-print. If you're in nxml-mode it looks like you need switch to sgml-mode first. You could write a command to temporarily switch to sgml-mode, run pretty-print, then switch back to nxml-mode.
For example, here is a command that will pretty-print the region, optionally with auto-fill enabled:
(defun xml-pretty-print (beg end &optional arg)
"Reformat the region between BEG and END.
With optional ARG, also auto-fill."
(interactive "*r\nP")
(let ((fill (or (bound-and-true-p auto-fill-function) -1)))
(sgml-mode)
(when arg (auto-fill-mode))
(sgml-pretty-print beg end)
(nxml-mode)
(auto-fill-mode fill)))
-
7In Emacs 26.1,
sgml-pretty-printworks directly from the nxml mode.SergiyKolesnikov– SergiyKolesnikov2020-07-06 11:55:53 +00:00Commented Jul 6, 2020 at 11:55
Mark your xml and do:
M-x sgml-pretty-print
Or just run the command without a marked region to prettify the whole buffer.
write this into your ~/.emacs.d/init.el:
(require 'sgml-mode)
(defun ninrod/reformat-xml ()
(interactive)
(save-excursion
(sgml-pretty-print (point-min) (point-max))
(indent-region (point-min) (point-max))))
reload emacs, then just call M-x reformat-xml on the badly formatted xml buffer.
source: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/
-
2He's not asking for something to reformat it. He's asking for something to make it human readable.RichieHH– RichieHH2020-08-24 17:34:25 +00:00Commented Aug 24, 2020 at 17:34
Following the hint of the answer above, and assuming you have tidy installed a variation could be:
`C-x h M-| tidy -quiet -xml -utf8 -indent -`
This will open a new buffer *Shell Command Output* instead of directly replacing the contents of the buffer. After checking the result, replace the old contents with the new with:
C-x h M-insert-buffer
choose the suggested default which will probably be *Shell Command Output*. You can save the command for later with a keyboard macro:
C-x ( C-x h M-| tidy -quiet -xml -utf8 -indent - C-x)
C-x C-k n pretty-xml
With this you can execute M-x pretty-xml to reformat the buffer.