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.