Si es realmente así de simple, puede simplemente escribirlo con printf() o similar.
Para el análisis, es mejor utilizar un analizador XML real (tal vez el SimpleXML que @netpork sugirió). Pero para algo realmente tan trivial, podrías usar expresiones regulares: este es mi set habitual, del que necesitarías principalmente 'attrlist' y 'stag' (para la lista de atributos y la etiqueta de inicio).
xname = "([_\\w][-_:.\\w\\d]*)"; # XML NAME (imperfect charset)
xnmtoken = "([-_:.\\w\\d]+)"; #
xncname = "([_\\w][-_.\\w\\d]*)"; #
qlit = '("[^"]*"|\'[^\']*\')'; # Includes the quotes
attr = "$xname\\s*=\\s*$qlit"; # Captures name and value
attrlist = "(\\s+$attr)*"; #
startTag = "<$xname$attrlist\\s*/?>"; #
endTag = "</$xname\\s*>"; #
comment = "(<!--[^-]*(-[^-]+)*-->)"; # Includes delims
pi = "(<\?$xname.*?\?>)"; # Processing instruction
dcl = "(<!$xname\\s+[^>]+>)"; # Markup dcl (imperfect)
cdataStart = "(<!\[CDATA\[)"; # Marked section open
cdataEnd = "(]]>)"; # Marked section close
charRef = "&(#\\d+|#[xX][0-9a-fA-F]+);"; # Num char ref (no delims)
entRef = "&$xname;"; # Named entity ref
pentRef = "%$xname;"; # Parameter entity ref
xtext = "[^<&]*"; # Neglects ']]>'
xdocument = "^($startTag|$endTag|$pi|$comment|$entRef|$xtext)+\$";
Un borrador de la especificación XML incluso incluía una gramática "trivial" para XML, que se pueden encontrar límites nodo correctamente, pero no atrapar todos los errores, la ampliación de las referencias de entidades, etc. Ver https://www.w3.org/TR/WD-xml-lang-970630#secF.
El principal inconveniente es que si se topa con datos más elegantes más adelante, puede romperse. Por ejemplo, alguien podría enviarle datos con un comentario allí, o un error de sintaxis, o un atributo sin comillas, o usando &quo;, o lo que sea.
Si necesita analizar muchos datos XML, puede probar [Simple XML] (http://simple.sourceforge.net/). – netpork