We want to make sure that the contents of the check tags are all valid, so we first need to make a list of valid checks:
(defparameter *valid-checks* '("ping" "pop3" "imap" "smtp" "http")
"List of valid check names")
Now that we've decided what all the valid check names should be, we can change our validation code to reflect this:
(toplevel-match
(tag "hostlist" ()
(tag+ "host" ((attr "name" :matches-regexp "[a-zA-Z]+"))
(tag "ip" ()
(pcdata :test-fn #'ip-address-p))
(tag? "description" ()
(pcdata))
(tag "checks" ()
(tag+ "check" ()
(pcdata :possible-values *valid-checks*)))))
(parse-xml-file "hosts.xml"))
Now if we try to enter something in a check tag other than ``ping'', ``pop3'', ``imap'', ``smtp'', or ``http'', validation will fail.