12. Überblick XML

Ab UniPlot R2010 kann die Funktion xml_parse_string verwendet werden, um XML in ein UniScript-Objekt zu zerlegen. In Sonderfällen (riesige Dokumente, parsen von Teilen, etc.) kann auch der Expat-Parser verwendet werden.

UniScript verwendet eine Untermenge des XML-Parsers Expat, Release 2.00.0. Expat ist eine C Library, geschrieben von James Clark um XML zu parsen. Weitere Informationen zu Expat finden Sie unter http://expat.sourceforge.net/.

Die Untermenge von Expat, die UniScript verwendet, sollte ausreichen um einen großen Teil von XML-Dokumenten zu parsen.

Expat ist ein Stream-orientierter XML-Parser. Dies bedeutet, dass der Anwender Handler registriert, bevor das Dokument geparsed wird.

Beispiel

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;
}
  XML
XML_ErrorString XML_ErrorString liefert einen String zur Fehlernummer die XML_GetErrorCode zurückgegeben hat.
XML_ExpatVersion XML_ExpatVersion liefert den Versionsstring des Expat-Parsers.
XML_GetCurrentByteCount XML_GetCurrentByteCount gibt die Anzahl an Bytes im aktuellen Event zurück.
XML_GetCurrentByteIndex XML_GetCurrentByteIndex
XML_GetCurrentColumnNumber XML_GetCurrentColumnNumber
XML_GetCurrentLineNumber XML_GetCurrentLineNumber liefert die Zeilennummer der aktuellen Position des Parsers.
XML_GetErrorCode XML_GetErrorCode liefert die Fehlernummer zurück.
XML_GetUserData XML_GetUserData liefert die Daten, die zuvor mit XML_SetUserData gesetzt wurden.
XML_Parse XML_Parse parsed ein Dokument oder einen Teil eines Dokuments.
XML_ParserCreate XML_ParserCreate erzeugt einen Parser.
XML_ParserFree Macht den Speicher, der durch den Parser genutzt wurde, wieder frei.
XML_SetCharacterDataHandler XML_SetCharacterDataHandler setzt den Handler für character-Daten.
XML_SetCommentHandler XML_SetCommentHandler setzt den Handler für Kommentare.
XML_SetDefaultHandler XML_SetDefaultHandler setzt einen Handler für Daten im Dokument für die kein anderer Handler gesetzt ist.
XML_SetElementHandler XML_SetElementHandler setzt die Handler für Start- und End-Tags.
XML_SetEndElementHandler XML_SetEndElementHandler setzt den Handler für end- und leere Tags.
XML_SetProcessingInstructionHandler XML_SetProcessingInstructionHandler setzt eine Handler für processing instructions.
XML_SetStartElementHandler XML_SetStartElementHandler
XML_SetUserData XML_SetUserData setzt Anwenderdaten, die an die Handler übergeben werden.
xml_esc xml_esc kodiert (escapes) spezielle XML-Zeichen.
xml_parse_string xml_parse_string wandelt einen gültigen XML-String in ein UniScript-Objekt um.
xml_save_node xml_save_node speichert ein speziell aufgebautes UniScript-Objekt als XML-Datei.
xml_simple xml_simple wandelt einen gültigen XML-String in ein UniScript-Objekt um.