[ expat-Bugs-1157018 ] not well-formed ( invalid token) for Certain XML tags
"SourceForge.net" <[email protected]> Sat, 02 Apr 2005 19:46:05 -0800
| Newsgroups | gmane.text.xml.expat.bugs |
|---|---|
| Message-ID | <[email protected]> |
Bugs item #1157018, was opened at 2005-03-04 17:56 Message generated for change (Comment added) made by kwaclaw You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110127&aid=1157018&group_id=10127 Category: XML::Parser (inactive) Group: None Status: Open Resolution: None Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: not well-formed ( invalid token) for Certain XML tags Initial Comment: Hello : I have a well formed XML packet but xmlwf thows out error on certain tags <entry id="DS000011" version="1"> <timestamp date="2004-11-05" time="22:37:30" zone="UNKNOWN"/> <source mfp="99.99.99.99" service=""/> <job_info result="success"> <sender email="[email protected]" authenticated="false">adad.dadad</sender> <scan_info page_count="1" size="ltr"/> <email_info size="888827" method="embedded" fileFormat="jpeg" colorSettings="color" result="success"> <subject>test</subject> <email_destination email="[email protected]" type="to" result="success"/> </email_info> </job_info> </entry> There are lot of other tags before and after these tags ( as shown above ). If i remove this particular section the xmlwf doesn;t show any error. The exact error is <LINE NO>:10 : not well-formed (invalid token) 10 is actually the column position. and in the lines shown above , "=" is in the column position 10. Is there any newer version that handles these kind of tags ? or pl. suggest me a work around ---------------------------------------------------------------------- >Comment By: Karl Waclawek (kwaclaw) Date: 2005-04-02 22:46 Message: Logged In: YES user_id=290026 Your main parsing code looks OK, although normally one would use a loop, but in your case it seems the whole file fits into the buffer. However, in your character data handler you are copying to temp_data, which is never allocated. Haven't looked at the other call-backs. You should also be aware that the character data between element tags can be reported through more than one call-back, so you need to buffer them and wait for the end-element call-back before null-terminating them. ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2005-04-02 21:54 Message: Logged In: NO hello, i am new to using xml parsers in C. i have been playing with expat on a windows machine running cygwin and a gcc compiler. The version i am using is 1.95.8. i have written a code which i think is ok as its parsing the document ok to certain extent only.its giving a invalid token error.i am attachig the code and the contents of the xml file if any one would point me to wher i might be making a mistake i would really appreciate it. the code is below /***************************************************************** * This program reads from an xml file and builds a tree that is later used to populate the array structure of nics, cabs etc */ #include <stdio.h> #include <stdlib.h> #include "expat.h" #define BUFFSIZE 18192 char Buff[BUFFSIZE]; int Depth; struct node{ char *node_name; //name of the node char **attr_name; //string list of attribute name char **attr_val; //array of values of the attributes char *text; //text that is associated with this node struct node **child; //array of children that this node can have struct node *parent; //pointer to the parent of the current node int child_no; }; /* This handler is called when ever a start tag is encountered in the input stream */ static void XMLCALL start(void *userData, const char *el, const char **attr) { struct node **temp_ptr = (struct node**)userData; printf("i am in start\n"); add_node(temp_ptr, el); } /* This handler is called when ever an end tag is encountered in the input stream */ static void XMLCALL end(void *userData, const char *el) { printf("i am in end\n"); struct node **temp_ptr = (struct node**)userData; close_node(temp_ptr); } /* This handler is called when ever a character tag is encountered in the input stream */ static void XMLCALL char_handle(void *userData, const XML_Char *s, int len){ char *data = (char *)s ; // pointer to the new string that we construct char *temp_data; int i = len; struct node **temp_ptr = (struct node**)userData; if (len >1) { while(i>0){ *temp_data = *data; i--; data++; temp_data++; } *temp_data = '\0'; temp_data = temp_data - len; printf("i am in char handle %s and len=%d\n", temp_data,len); } add_text(temp_ptr,data); } void add_node(struct node **void_node_ptr, char *el ){ struct node* next_node_ptr = (struct node*)malloc(sizeof (struct node*)); next_node_ptr->child_no = 0; struct node *current_node_ptr = (struct node *) *void_node_ptr; // update the previous node with the address of the current node // current_node_ptr->child[current_node_ptr- >child_no] = next_node_ptr; //current_node_ptr->child_no++; next_node_ptr->node_name = el; next_node_ptr->parent = current_node_ptr; current_node_ptr = next_node_ptr; } void add_text(struct node **void_node_ptr,char *data ){ struct node *current_node_ptr = (struct node *) *void_node_ptr; current_node_ptr->text = data; //printf(" in add_text with %s", current_node_ptr- >text); } void close_node(struct node **void_node_ptr ){ struct node *current_node_ptr = (struct node *) *void_node_ptr; current_node_ptr = current_node_ptr->parent; } void main(int argc, char *argv[]){ printf("i am in main\n"); XML_Parser p = XML_ParserCreate(NULL); if (! p) { fprintf(stderr, "Couldn't allocate memory for parser\n"); exit(-1); } //char *testdata = "venu\0"; struct node *node_ptr = (struct node*)malloc(sizeof(struct node*)); node_ptr->child_no = 0; //struct node *current_node_ptr = node_ptr; void *userData = (void *)node_ptr; XML_SetElementHandler(p, start, end); XML_SetCharacterDataHandler(p,char_handle); XML_SetUserData(p, &userData); FILE *fp; int len; int done=1; fp = fopen("/cygdrive/c/master-project/C- programming/test2.xml", "r"); len = fread(Buff, 1, BUFFSIZE, fp); printf("bytes read are %d and buffer has %d\n", len,sizeof (Buff)); fclose(fp); //printf("i am here"); if (XML_Parse(p,Buff,len,done) == XML_STATUS_ERROR) { fprintf(stderr, "Parse error at line %d:\n%s\n", XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p))); exit(-1); } } The contents of the file are <a> <b> <c>kkkk</c> </b> <d> <e>pppp</e> </d> </a> thanks venu ---------------------------------------------------------------------- Comment By: Karl Waclawek (kwaclaw) Date: 2005-03-13 08:56 Message: Logged In: YES user_id=290026 Show us your code - you may have a problem there. ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2005-03-04 18:02 Message: Logged In: NO Operating System is HP-UX. ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2005-03-04 18:01 Message: Logged In: NO Operating System is HP-UX. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110127&aid=1157018&group_id=10127