diff --git a/testparser.c b/testparser.c index d3a3e387..c28e8bbf 100644 --- a/testparser.c +++ b/testparser.c @@ -467,6 +467,76 @@ testReaderContent(void) { return err; } +static int +testReaderNode(xmlTextReader *reader) { + xmlChar *string; + int type; + int err = 0; + + type = xmlTextReaderNodeType(reader); + string = xmlTextReaderReadString(reader); + + if (type == XML_READER_TYPE_ELEMENT) { + xmlNodePtr node = xmlTextReaderCurrentNode(reader); + + if ((node->children == NULL) != (string == NULL)) + err = 1; + } else if (type == XML_READER_TYPE_TEXT || + type == XML_READER_TYPE_CDATA || + type == XML_READER_TYPE_WHITESPACE || + type == XML_READER_TYPE_SIGNIFICANT_WHITESPACE) { + if (string == NULL) + err = 1; + } else { + if (string != NULL) + err = 1; + } + + if (err) + fprintf(stderr, "xmlTextReaderReadString failed for %d\n", type); + + xmlFree(string); + + return err; +} + +static int +testReader(void) { + xmlTextReader *reader; + const xmlChar *xml = BAD_CAST + "\n" + " xyz\n" + " \n" + " \n" + " \n" + " \n" + ""; + int err = 0; + + reader = xmlReaderForDoc(xml, NULL, NULL, 0); + + while (xmlTextReaderRead(reader) > 0) { + if (testReaderNode(reader) > 0) { + err = 1; + break; + } + + if (xmlTextReaderMoveToFirstAttribute(reader) > 0) { + do { + if (testReaderNode(reader) > 0) { + err = 1; + break; + } + } while (xmlTextReaderMoveToNextAttribute(reader) > 0); + + xmlTextReaderMoveToElement(reader); + } + } + + xmlFreeTextReader(reader); + return err; +} + #ifdef LIBXML_XINCLUDE_ENABLED typedef struct { char *message; @@ -834,6 +904,7 @@ main(void) { #ifdef LIBXML_READER_ENABLED err |= testReaderEncoding(); err |= testReaderContent(); + err |= testReader(); #ifdef LIBXML_XINCLUDE_ENABLED err |= testReaderXIncludeError(); #endif diff --git a/xmlreader.c b/xmlreader.c index 403a4e4e..6d815a94 100644 --- a/xmlreader.c +++ b/xmlreader.c @@ -1742,8 +1742,9 @@ xmlTextReaderReadOuterXml(xmlTextReaderPtr reader) * * Reads the contents of an element or a text node as a string. * - * Returns a string containing the contents of the Element or Text node, - * or NULL if the reader is positioned on any other type of node. + * Returns a string containing the contents of the non-empty Element or + * Text node (including CDATA sections), or NULL if the reader + * is positioned on any other type of node. * The string must be deallocated by the caller. */ xmlChar * @@ -1766,11 +1767,8 @@ xmlTextReaderReadString(xmlTextReaderPtr reader) (node->children == NULL)) return(NULL); break; - case XML_ATTRIBUTE_NODE: - /* TODO */ - break; default: - break; + return(NULL); } buf = xmlBufCreate(50);