output: Fix XML parsing in output_get_text_from_markup().
[pspp] / src / output / driver.c
index c9c54ca0e66b01490ff8d36333d7cc5e6c1a50df..8b5a66249d6a4b54e902468dc7319249110bf008 100644 (file)
@@ -548,18 +548,21 @@ output_driver_parse_option (const char *option, struct string_map *options)
 char *
 output_get_text_from_markup (const char *markup)
 {
-  xmlDoc *doc = xmlReadMemory (markup, strlen (markup), "noname.xml", "UTF-8",
-                               (XML_PARSE_NOERROR | XML_PARSE_NOWARNING
-                                | XML_PARSE_NONET | XML_PARSE_NOCDATA));
-  if (!doc)
+  xmlParserCtxt *parser = xmlCreatePushParserCtxt (NULL, NULL, NULL, 0, NULL);
+  if (!parser)
     return xstrdup (markup);
 
-  char *content = CHAR_CAST (char *,
-                             xmlNodeGetContent (xmlDocGetRootElement (doc)));
-  if (!content)
-    content = xstrdup (markup);
-
-  xmlFreeDoc (doc);
+  xmlParseChunk (parser, "<xml>", strlen ("<xml>"), false);
+  xmlParseChunk (parser, markup, strlen (markup), false);
+  xmlParseChunk (parser, "</xml>", strlen ("</xml>"), true);
+
+  char *content
+    = (parser->wellFormed
+       ? CHAR_CAST (char *,
+                    xmlNodeGetContent (xmlDocGetRootElement (parser->myDoc)))
+       : xstrdup (markup));
+  xmlFreeDoc (parser->myDoc);
+  xmlFreeParserCtxt (parser);
 
   return content;
 }