12. Overview XML

Betginning with UniPlot R2010 the xml_parse_string function can be used to load XML into a UniScript object. In some special cased (huge documents, paring a sub section, etc.) the Expat parser can be used.

UniScript uses a subset of Expat, Release 2.00.0. Expat is a C library written by James Clark to parse XML. Go to http://expat.sourceforge.net/ to find more about Expat.

The Expat subset used by UniScript should be sufficient to parse most XML documents.

Expat is a stream oriented XML parser. This means that the user registers handler functions, which are called during the parsing process.

Example

def startElement(hParser, name, atts)
{
    hInfo = XML_GetUserData(hParser);
    depthPtr = MapLookup(hInfo, "depthPtr");
    fpout = MapLookup(hInfo, "fpout");

    if (depthPtr > 0) {
        for (i in 1:depthPtr) {
            fprintf(fpout, "  ");
        }
    }
      fprintf(fpout, "<%s", name);
    MapSetAt(hInfo, "name", name);
     MapSetAt(hInfo, sprintf("name%d", depthPtr), name);

      if (atts[1] != "") {
          for (i in 1:len(atts)/2) {
                fprintf(fpout, " %s=\"%s\" ", atts[i;1], atts[i;2]);
          }
      }
      fprintf(fpout, ">\n");
    depthPtr = depthPtr + 1;
    MapSetAt(hInfo, "depthPtr", depthPtr);
}

def charData(hParser, data)
{
    hInfo = XML_GetUserData(hParser);
    fpout = MapLookup(hInfo, "fpout");
      fprintf(fpout, "%s", data);
}

def endElement(hParser, name)
{
    hInfo = XML_GetUserData(hParser);
    depthPtr = MapLookup(hInfo, "depthPtr");
    fpout = MapLookup(hInfo, "fpout");

    depthPtr = depthPtr - 1;

    if (depthPtr > 0) {
        for (i in 1:depthPtr) {
            fprintf(fpout, "  ");
        }
    }

     name = MapLookup(hInfo, sprintf("name%d", depthPtr));
      fprintf(fpout, "</%s>\n", name);
    MapSetAt(hInfo, "depthPtr", depthPtr);
}

def XMLFormatFile(ssFile)
{
    hInfo = MapCreate();
    MapSetAt(hInfo, "depthPtr", 0);

    fp = fopen(ssFile, "rt")
    if (!fp) return FALSE;
    ss = fread(fp, "char");
    fclose(fp);
    fpout = fopen(ssFile + ".new", "w")
    MapSetAt(hInfo, "fpout", fpout);

    h = XML_ParserCreate()
    XML_SetStartElementHandler(h, "startElement");
    XML_SetEndElementHandler(h, "endElement");
    XML_SetCharacterDataHandler(h, "charData");
    XML_SetUserData(h, hInfo);

    bRet = XML_Parse(h, ss);
    if (bRet == 0) {
        nErrCode = XML_GetErrorCode(h);
        s = XML_ErrorString(nErrCode);
        nLine = XML_GetCurrentLineNumber(h)
        MessageBox(sprintf("Error:%d\n\n%s\n\nLine:%d", nErrCode, s, nLine));
    }
    XML_ParserFree(h);
    MapDestroy(hInfo);
    fclose(fpout);
    EdCreate(ssFile + ".new")
    return TRUE;
}
  Functions
XML_ErrorString XML_ErrorString returns a string describing the error corresponding to code. The code should be one of the enums that can be returned from XML_GetErrorCode.
XML_ExpatVersion XML_ExpatVersion return the library version as a string (e.g. “expat_1.95.1”).
XML_GetCurrentByteCount XML_GetCurrentByteCount return the number of bytes in the current event. Returns 0 if the event is inside a reference to an internal entity.
XML_GetCurrentByteIndex XML_GetCurrentByteIndex
XML_GetCurrentColumnNumber XML_GetCurrentColumnNumber
XML_GetCurrentLineNumber XML_GetCurrentLineNumber returns the line number of the position.
XML_GetErrorCode XML_GetErrorCode returns what type of error has occurred.
XML_GetUserData XML_GetUserData returns the data that was set with XML_SetUserData.
XML_Parse XML_Parse parses a complete or a part of a document.
XML_ParserCreate Construct a new parser.
XML_ParserFree Free memory used by the parser.
XML_SetCharacterDataHandler Set a text handler.
XML_SetCommentHandler Set a handler for comments.
XML_SetDefaultHandler XML_SetDefaultHandler sets a handler for any characters in the document which would not otherwise be handled.
XML_SetElementHandler XML_SetElementHandler
XML_SetEndElementHandler Set handler for end (and empty) tags.
XML_SetProcessingInstructionHandler XML_SetProcessingInstructionHandler
XML_SetStartElementHandler XML_SetStartElementHandler
XML_SetUserData XML_SetUserData sets the user data that gets passed to handlers.
xml_esc xml_esc escapes special XML characters.
xml_parse_string xml_parse_string converts a valid XML string into a UniScript object.
xml_save_node xml_save_node saves a UniScript object as an XML file.
xml_simple xml_simple converts a valid XML string into a UniScript object.

See also

Overview Files