⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlwf.c

📁 一个很好用的解析
💻 C
📖 第 1 页 / 共 2 页
字号:
/*Copyright (c) 1998, 1999 Thai Open Source Software Center LtdSee the file copying.txt for copying permission.*/#include <stdio.h>#include <stdlib.h>#include <stddef.h>#include <string.h>#include "xmlparse.h"#include "codepage.h"#include "xmlfile.h"#include "xmltchar.h"#ifdef _MSC_VER#include <crtdbg.h>#endif/* This ensures proper sorting. */#define NSSEP T('\001')static void characterData(void *userData, const XML_Char *s, int len){  FILE *fp = userData;  for (; len > 0; --len, ++s) {    switch (*s) {    case T('&'):      fputts(T("&amp;"), fp);      break;    case T('<'):      fputts(T("&lt;"), fp);      break;    case T('>'):      fputts(T("&gt;"), fp);      break;#ifdef W3C14N    case 13:      fputts(T("&#xD;"), fp);      break;#else    case T('"'):      fputts(T("&quot;"), fp);      break;    case 9:    case 10:    case 13:      ftprintf(fp, T("&#%d;"), *s);      break;#endif    default:      puttc(*s, fp);      break;    }  }}static void attributeValue(FILE *fp, const XML_Char *s){  puttc(T('='), fp);  puttc(T('"'), fp);  for (;;) {    switch (*s) {    case 0:    case NSSEP:      puttc(T('"'), fp);      return;    case T('&'):      fputts(T("&amp;"), fp);      break;    case T('<'):      fputts(T("&lt;"), fp);      break;    case T('"'):      fputts(T("&quot;"), fp);      break;#ifdef W3C14N    case 9:      fputts(T("&#x9;"), fp);      break;    case 10:      fputts(T("&#xA;"), fp);      break;    case 13:      fputts(T("&#xD;"), fp);      break;#else    case T('>'):      fputts(T("&gt;"), fp);      break;    case 9:    case 10:    case 13:      ftprintf(fp, T("&#%d;"), *s);      break;#endif    default:      puttc(*s, fp);      break;    }    s++;  }}/* Lexicographically comparing UTF-8 encoded attribute values,is equivalent to lexicographically comparing based on the character number. */static int attcmp(const void *att1, const void *att2){  return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2);}static void startElement(void *userData, const XML_Char *name, const XML_Char **atts){  int nAtts;  const XML_Char **p;  FILE *fp = userData;  puttc(T('<'), fp);  fputts(name, fp);  p = atts;  while (*p)    ++p;  nAtts = (p - atts) >> 1;  if (nAtts > 1)    qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp);  while (*atts) {    puttc(T(' '), fp);    fputts(*atts++, fp);    attributeValue(fp, *atts);    atts++;  }  puttc(T('>'), fp);}static void endElement(void *userData, const XML_Char *name){  FILE *fp = userData;  puttc(T('<'), fp);  puttc(T('/'), fp);  fputts(name, fp);  puttc(T('>'), fp);}static int nsattcmp(const void *p1, const void *p2){  const XML_Char *att1 = *(const XML_Char **)p1;  const XML_Char *att2 = *(const XML_Char **)p2;  int sep1 = (tcsrchr(att1, NSSEP) != 0);  int sep2 = (tcsrchr(att1, NSSEP) != 0);  if (sep1 != sep2)    return sep1 - sep2;  return tcscmp(att1, att2);}static void startElementNS(void *userData, const XML_Char *name, const XML_Char **atts){  int nAtts;  int nsi;  const XML_Char **p;  FILE *fp = userData;  const XML_Char *sep;  puttc(T('<'), fp);  sep = tcsrchr(name, NSSEP);  if (sep) {    fputts(T("n1:"), fp);    fputts(sep + 1, fp);    fputts(T(" xmlns:n1"), fp);    attributeValue(fp, name);    nsi = 2;  }  else {    fputts(name, fp);    nsi = 1;  }  p = atts;  while (*p)    ++p;  nAtts = (p - atts) >> 1;  if (nAtts > 1)    qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, nsattcmp);  while (*atts) {    name = *atts++;    sep = tcsrchr(name, NSSEP);    puttc(T(' '), fp);    if (sep) {      ftprintf(fp, T("n%d:"), nsi);      fputts(sep + 1, fp);    }    else      fputts(name, fp);    attributeValue(fp, *atts);    if (sep) {      ftprintf(fp, T(" xmlns:n%d"), nsi++);      attributeValue(fp, name);    }    atts++;  }  puttc(T('>'), fp);}static void endElementNS(void *userData, const XML_Char *name){  FILE *fp = userData;  const XML_Char *sep;  puttc(T('<'), fp);  puttc(T('/'), fp);  sep = tcsrchr(name, NSSEP);  if (sep) {    fputts(T("n1:"), fp);    fputts(sep + 1, fp);  }  else    fputts(name, fp);  puttc(T('>'), fp);}#ifndef W3C14Nstatic void processingInstruction(void *userData, const XML_Char *target, const XML_Char *data){  FILE *fp = userData;  puttc(T('<'), fp);  puttc(T('?'), fp);  fputts(target, fp);  puttc(T(' '), fp);  fputts(data, fp);  puttc(T('?'), fp);  puttc(T('>'), fp);}#endif /* not W3C14N */static void defaultCharacterData(XML_Parser parser, const XML_Char *s, int len){  XML_DefaultCurrent(parser);}static void defaultStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts){  XML_DefaultCurrent(parser);}static void defaultEndElement(XML_Parser parser, const XML_Char *name){  XML_DefaultCurrent(parser);}static void defaultProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data){  XML_DefaultCurrent(parser);}static void nopCharacterData(XML_Parser parser, const XML_Char *s, int len){}static void nopStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts){}static void nopEndElement(XML_Parser parser, const XML_Char *name){}static void nopProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data){}static void markup(XML_Parser parser, const XML_Char *s, int len){  FILE *fp = XML_GetUserData(parser);  for (; len > 0; --len, ++s)    puttc(*s, fp);}staticvoid metaLocation(XML_Parser parser){  const XML_Char *uri = XML_GetBase(parser);  if (uri)    ftprintf(XML_GetUserData(parser), T(" uri=\"%s\""), uri);  ftprintf(XML_GetUserData(parser),           T(" byte=\"%ld\" nbytes=\"%d\" line=\"%d\" col=\"%d\""),	   XML_GetCurrentByteIndex(parser),	   XML_GetCurrentByteCount(parser),	   XML_GetCurrentLineNumber(parser),	   XML_GetCurrentColumnNumber(parser));}staticvoid metaStartDocument(XML_Parser parser){  fputts(T("<document>\n"), XML_GetUserData(parser));}staticvoid metaEndDocument(XML_Parser parser){  fputts(T("</document>\n"), XML_GetUserData(parser));}staticvoid metaStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts){  FILE *fp = XML_GetUserData(parser);  const XML_Char **specifiedAttsEnd    = atts + XML_GetSpecifiedAttributeCount(parser);  const XML_Char **idAttPtr;  int idAttIndex = XML_GetIdAttributeIndex(parser);  if (idAttIndex < 0)    idAttPtr = 0;  else    idAttPtr = atts + idAttIndex;      ftprintf(fp, T("<starttag name=\"%s\""), name);  metaLocation(parser);  if (*atts) {    fputts(T(">\n"), fp);    do {      ftprintf(fp, T("<attribute name=\"%s\" value=\""), atts[0]);      characterData(fp, atts[1], tcslen(atts[1]));      if (atts >= specifiedAttsEnd)	fputts(T("\" defaulted=\"yes\"/>\n"), fp);      else if (atts == idAttPtr)	fputts(T("\" id=\"yes\"/>\n"), fp);      else	fputts(T("\"/>\n"), fp);    } while (*(atts += 2));    fputts(T("</starttag>\n"), fp);  }  else    fputts(T("/>\n"), fp);}staticvoid metaEndElement(XML_Parser parser, const XML_Char *name){  FILE *fp = XML_GetUserData(parser);  ftprintf(fp, T("<endtag name=\"%s\""), name);  metaLocation(parser);  fputts(T("/>\n"), fp);}staticvoid metaProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data){  FILE *fp = XML_GetUserData(parser);  ftprintf(fp, T("<pi target=\"%s\" data=\""), target);  characterData(fp, data, tcslen(data));  puttc(T('"'), fp);  metaLocation(parser);  fputts(T("/>\n"), fp);}staticvoid metaComment(XML_Parser parser, const XML_Char *data){  FILE *fp = XML_GetUserData(parser);  fputts(T("<comment data=\""), fp);  characterData(fp, data, tcslen(data));  puttc(T('"'), fp);  metaLocation(parser);  fputts(T("/>\n"), fp);}staticvoid metaStartCdataSection(XML_Parser parser){  FILE *fp = XML_GetUserData(parser);  fputts(T("<startcdata"), fp);  metaLocation(parser);  fputts(T("/>\n"), fp);}staticvoid metaEndCdataSection(XML_Parser parser){  FILE *fp = XML_GetUserData(parser);  fputts(T("<endcdata"), fp);  metaLocation(parser);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -