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. |
Siehe auch
12.1. Copyright Expat¶
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
and Clark Cooper
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Weitere Informationen finden Sie unter http://expat.sourceforge.net/.
id-2051559