📄 debugxml.c
字号:
void xmlDebugDumpAttr(FILE *output, xmlAttrPtr attr, int depth) { int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; fprintf(output, shift); fprintf(output, "ATTRIBUTE %s\n", attr->name); if (attr->children != NULL) xmlDebugDumpNodeList(output, attr->children, depth + 1); /* * Do a bit of checking */ if (attr->parent == NULL) fprintf(output, "PBM: Attr has no parent\n"); if (attr->doc == NULL) fprintf(output, "PBM: Attr has no doc\n"); if ((attr->parent != NULL) && (attr->doc != attr->parent->doc)) fprintf(output, "PBM: Attr doc differs from parent's one\n"); if (attr->prev == NULL) { if ((attr->parent != NULL) && (attr->parent->properties != attr)) fprintf(output, "PBM: Attr has no prev and not first of list\n"); } else { if (attr->prev->next != attr) fprintf(output, "PBM: Attr prev->next : back link wrong\n"); } if (attr->next != NULL) { if (attr->next->prev != attr) fprintf(output, "PBM: Attr next->prev : forward link wrong\n"); }}void xmlDebugDumpAttrList(FILE *output, xmlAttrPtr attr, int depth) { while (attr != NULL) { xmlDebugDumpAttr(output, attr, depth); attr = attr->next; }}void xmlDebugDumpOneNode(FILE *output, xmlNodePtr node, int depth) { int i; char shift[100]; for (i = 0;((i < depth) && (i < 25));i++) shift[2 * i] = shift[2 * i + 1] = ' '; shift[2 * i] = shift[2 * i + 1] = 0; switch (node->type) { case XML_ELEMENT_NODE: fprintf(output, shift); fprintf(output, "ELEMENT "); if (node->ns != NULL) fprintf(output, "%s:%s\n", node->ns->prefix, node->name); else fprintf(output, "%s\n", node->name); break; case XML_ATTRIBUTE_NODE: fprintf(output, shift); fprintf(output, "Error, ATTRIBUTE found here\n"); break; case XML_TEXT_NODE: fprintf(output, shift); fprintf(output, "TEXT\n"); break; case XML_CDATA_SECTION_NODE: fprintf(output, shift); fprintf(output, "CDATA_SECTION\n"); break; case XML_ENTITY_REF_NODE: fprintf(output, shift); fprintf(output, "ENTITY_REF(%s)\n", node->name); break; case XML_ENTITY_NODE: fprintf(output, shift); fprintf(output, "ENTITY\n"); break; case XML_PI_NODE: fprintf(output, shift); fprintf(output, "PI %s\n", node->name); break; case XML_COMMENT_NODE: fprintf(output, shift); fprintf(output, "COMMENT\n"); break; case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: fprintf(output, shift); fprintf(output, "Error, DOCUMENT found here\n"); break; case XML_DOCUMENT_TYPE_NODE: fprintf(output, shift); fprintf(output, "DOCUMENT_TYPE\n"); break; case XML_DOCUMENT_FRAG_NODE: fprintf(output, shift); fprintf(output, "DOCUMENT_FRAG\n"); break; case XML_NOTATION_NODE: fprintf(output, "NOTATION\n"); break; case XML_DTD_NODE: xmlDebugDumpDtd(output, (xmlDtdPtr) node, depth); return; case XML_ELEMENT_DECL: xmlDebugDumpElemDecl(output, (xmlElementPtr) node, depth); return; case XML_ATTRIBUTE_DECL: xmlDebugDumpAttrDecl(output, (xmlAttributePtr) node, depth); return; case XML_ENTITY_DECL: xmlDebugDumpEntityDecl(output, (xmlEntityPtr) node, depth); return; default: fprintf(output, shift); fprintf(output, "NODE_%d\n", node->type); } if (node->doc == NULL) { fprintf(output, shift); fprintf(output, "doc == NULL !!!\n"); } if (node->nsDef != NULL) xmlDebugDumpNamespaceList(output, node->nsDef, depth + 1); if (node->properties != NULL) xmlDebugDumpAttrList(output, node->properties, depth + 1); if (node->type != XML_ENTITY_REF_NODE) { if (node->content != NULL) { fprintf(output, shift); fprintf(output, "content=");#ifndef XML_USE_BUFFER_CONTENT xmlDebugDumpString(output, node->content);#else xmlDebugDumpString(output, xmlBufferContent(node->content));#endif fprintf(output, "\n"); } } else { xmlEntityPtr ent; ent = xmlGetDocEntity(node->doc, node->name); if (ent != NULL) xmlDebugDumpEntity(output, ent, depth + 1); } /* * Do a bit of checking */ if (node->parent == NULL) fprintf(output, "PBM: Node has no parent\n"); if (node->doc == NULL) fprintf(output, "PBM: Node has no doc\n"); if ((node->parent != NULL) && (node->doc != node->parent->doc)) fprintf(output, "PBM: Node doc differs from parent's one\n"); if (node->prev == NULL) { if ((node->parent != NULL) && (node->parent->children != node)) fprintf(output, "PBM: Node has no prev and not first of list\n"); } else { if (node->prev->next != node) fprintf(output, "PBM: Node prev->next : back link wrong\n"); } if (node->next == NULL) { if ((node->parent != NULL) && (node->parent->last != node)) fprintf(output, "PBM: Node has no next and not last of list\n"); } else { if (node->next->prev != node) fprintf(output, "PBM: Node next->prev : forward link wrong\n"); }}void xmlDebugDumpNode(FILE *output, xmlNodePtr node, int depth) { xmlDebugDumpOneNode(output, node, depth); if (node->children != NULL) xmlDebugDumpNodeList(output, node->children, depth + 1);}void xmlDebugDumpNodeList(FILE *output, xmlNodePtr node, int depth) { while (node != NULL) { xmlDebugDumpNode(output, node, depth); node = node->next; }}void xmlDebugDumpDocumentHead(FILE *output, xmlDocPtr doc) { if (output == NULL) output = stdout; if (doc == NULL) { fprintf(output, "DOCUMENT == NULL !\n"); return; } switch (doc->type) { case XML_ELEMENT_NODE: fprintf(output, "Error, ELEMENT found here "); break; case XML_ATTRIBUTE_NODE: fprintf(output, "Error, ATTRIBUTE found here\n"); break; case XML_TEXT_NODE: fprintf(output, "Error, TEXT\n"); break; case XML_CDATA_SECTION_NODE: fprintf(output, "Error, CDATA_SECTION\n"); break; case XML_ENTITY_REF_NODE: fprintf(output, "Error, ENTITY_REF\n"); break; case XML_ENTITY_NODE: fprintf(output, "Error, ENTITY\n"); break; case XML_PI_NODE: fprintf(output, "Error, PI\n"); break; case XML_COMMENT_NODE: fprintf(output, "Error, COMMENT\n"); break; case XML_DOCUMENT_NODE: fprintf(output, "DOCUMENT\n"); break; case XML_HTML_DOCUMENT_NODE: fprintf(output, "HTML DOCUMENT\n"); break; case XML_DOCUMENT_TYPE_NODE: fprintf(output, "Error, DOCUMENT_TYPE\n"); break; case XML_DOCUMENT_FRAG_NODE: fprintf(output, "Error, DOCUMENT_FRAG\n"); break; case XML_NOTATION_NODE: fprintf(output, "Error, NOTATION\n"); break; default: fprintf(output, "NODE_%d\n", doc->type); } if (doc->name != NULL) { fprintf(output, "name="); xmlDebugDumpString(output, BAD_CAST doc->name); fprintf(output, "\n"); } if (doc->version != NULL) { fprintf(output, "version="); xmlDebugDumpString(output, doc->version); fprintf(output, "\n"); } if (doc->encoding != NULL) { fprintf(output, "encoding="); xmlDebugDumpString(output, doc->encoding); fprintf(output, "\n"); } if (doc->standalone) fprintf(output, "standalone=true\n"); if (doc->oldNs != NULL) xmlDebugDumpNamespaceList(output, doc->oldNs, 0);}void xmlDebugDumpDocument(FILE *output, xmlDocPtr doc) { if (output == NULL) output = stdout; if (doc == NULL) { fprintf(output, "DOCUMENT == NULL !\n"); return; } xmlDebugDumpDocumentHead(output, doc); if (((doc->type == XML_DOCUMENT_NODE) || (doc->type == XML_HTML_DOCUMENT_NODE)) && (doc->children != NULL)) xmlDebugDumpNodeList(output, doc->children, 1);} void xmlDebugDumpEntities(FILE *output, xmlDocPtr doc) { int i; xmlEntityPtr cur; if (output == NULL) output = stdout; if (doc == NULL) { fprintf(output, "DOCUMENT == NULL !\n"); return; } switch (doc->type) { case XML_ELEMENT_NODE: fprintf(output, "Error, ELEMENT found here "); break; case XML_ATTRIBUTE_NODE: fprintf(output, "Error, ATTRIBUTE found here\n"); break; case XML_TEXT_NODE: fprintf(output, "Error, TEXT\n"); break; case XML_CDATA_SECTION_NODE: fprintf(output, "Error, CDATA_SECTION\n"); break; case XML_ENTITY_REF_NODE: fprintf(output, "Error, ENTITY_REF\n"); break; case XML_ENTITY_NODE: fprintf(output, "Error, ENTITY\n"); break; case XML_PI_NODE: fprintf(output, "Error, PI\n"); break; case XML_COMMENT_NODE: fprintf(output, "Error, COMMENT\n"); break; case XML_DOCUMENT_NODE: fprintf(output, "DOCUMENT\n"); break; case XML_HTML_DOCUMENT_NODE: fprintf(output, "HTML DOCUMENT\n"); break; case XML_DOCUMENT_TYPE_NODE: fprintf(output, "Error, DOCUMENT_TYPE\n"); break; case XML_DOCUMENT_FRAG_NODE: fprintf(output, "Error, DOCUMENT_FRAG\n"); break; case XML_NOTATION_NODE: fprintf(output, "Error, NOTATION\n"); break; default: fprintf(output, "NODE_%d\n", doc->type); } if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) doc->intSubset->entities; fprintf(output, "Entities in internal subset\n"); for (i = 0;i < table->nb_entities;i++) { cur = table->table[i]; fprintf(output, "%d : %s : ", i, cur->name); switch (cur->etype) { case XML_INTERNAL_GENERAL_ENTITY: fprintf(output, "INTERNAL GENERAL, "); break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: fprintf(output, "EXTERNAL PARSED, "); break; case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: fprintf(output, "EXTERNAL UNPARSED, "); break; case XML_INTERNAL_PARAMETER_ENTITY: fprintf(output, "INTERNAL PARAMETER, "); break; case XML_EXTERNAL_PARAMETER_ENTITY: fprintf(output, "EXTERNAL PARAMETER, "); break; default: fprintf(output, "UNKNOWN TYPE %d", cur->etype); } if (cur->ExternalID != NULL) fprintf(output, "ID \"%s\"", cur->ExternalID); if (cur->SystemID != NULL) fprintf(output, "SYSTEM \"%s\"", cur->SystemID); if (cur->orig != NULL) fprintf(output, "\n orig \"%s\"", cur->orig); if (cur->content != NULL) fprintf(output, "\n content \"%s\"", cur->content); fprintf(output, "\n"); } } else fprintf(output, "No entities in internal subset\n"); if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { xmlEntitiesTablePtr table = (xmlEntitiesTablePtr) doc->extSubset->entities; fprintf(output, "Entities in external subset\n"); for (i = 0;i < table->nb_entities;i++) { cur = table->table[i]; fprintf(output, "%d : %s : ", i, cur->name); switch (cur->etype) { case XML_INTERNAL_GENERAL_ENTITY: fprintf(output, "INTERNAL GENERAL, "); break; case XML_EXTERNAL_GENERAL_PARSED_ENTITY: fprintf(output, "EXTERNAL PARSED, "); break; case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: fprintf(output, "EXTERNAL UNPARSED, "); break; case XML_INTERNAL_PARAMETER_ENTITY: fprintf(output, "INTERNAL PARAMETER, "); break; case XML_EXTERNAL_PARAMETER_ENTITY: fprintf(output, "EXTERNAL PARAMETER, "); break; default: fprintf(output, "UNKNOWN TYPE %d", cur->etype); } if (cur->ExternalID != NULL) fprintf(output, "ID \"%s\"", cur->ExternalID); if (cur->SystemID != NULL) fprintf(output, "SYSTEM \"%s\"", cur->SystemID); if (cur->orig != NULL) fprintf(output, "\n orig \"%s\"", cur->orig); if (cur->content != NULL) fprintf(output, "\n content \"%s\"", cur->content); fprintf(output, "\n"); } } else fprintf(output, "No entities in external subset\n");}static int xmlLsCountNode(xmlNodePtr node) { int ret = 0; xmlNodePtr list = NULL; switch (node->type) { case XML_ELEMENT_NODE: list = node->children; break; case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: list = ((xmlDocPtr) node)->children; break; case XML_ATTRIBUTE_NODE: list = ((xmlAttrPtr) node)->children; break; case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: if (node->content != NULL) {#ifndef XML_USE_BUFFER_CONTENT ret = xmlStrlen(node->content);#else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -