HelloI am trying to parse data read from the network, so I progressively feed the data into a reader. I'm using a xmlReaderForMemory, when I receive the data I feed it using this function: xmlReaderNewMemory. For pulling the data out I use xmlTextReaderRead.
Is this the correct way to do such a thing ?I'm using this xml sample. I'm feeding one line at a time, using different xmlReaderForMemory calls:
1. "<stream1>"
2. "<streams></streams>"
3. "</stream1>\n";
I use the following code, slightly simplified for exemplification
"reader" is a class member initialised in ctor:
char dummy = '<';
reader = xmlReaderForMemory(&dummy, sizeof(dummy), NULL, NULL, 0);
void Parser::parse(
const char* xmlData,
unsigned int size
) throw (InvalidXmlException) {
// initialize the parser
int result = xmlReaderNewMemory(reader, xmlData, size, NULL, NULL,
/*XML_PARSE_NOERROR |*/ XML_PARSE_NOWARNING | XML_PARSE_RECOVER);
if (result == -1)
TRACEABLE_THROW(InvalidXmlException());
result = xmlTextReaderRead(reader);
if (result == -1)
TRACEABLE_THROW(InvalidXmlException());
while (result == 1) { //second example
xmlChar *name, *value;
name = xmlTextReaderName(reader);
if (name == NULL)
name = xmlStrdup(BAD_CAST "--");
value = xmlTextReaderValue(reader);
printf("\n depth:%d type:%d NAME:%s empty:%d",
xmlTextReaderDepth(reader),
xmlTextReaderNodeType(reader),
name,
xmlTextReaderIsEmptyElement(reader));
xmlFree(name);
if (value == NULL)
printf("\n");
else {
printf(" %s\n", value);
xmlFree(value);
}
result = xmlTextReaderRead(reader); //second example
if (result == -1) //second
example
TRACEABLE_THROW(InvalidXmlException()); //second example
} //second example
}
After printing the properties of the first tag, <stream1>, I get this error:
line 1: parser error : Extra content at the end of the document
<stream1>
In the second try I removed the lines having the comment //second example .
Thus calling just once xmlTextReaderRead.
Here, I get the properties of the tags (without the closing tag:
</streams> ) until the reader reaches the last element, </stream>
I get this error: Entity: line 1: parser error : StartTag: invalid element name </stream1> ^ Any ideeas ? Thank you very much.
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature