XmlSave
Der Befehl erzeugt aus dem übergebenen Objekt (obj) eine XML-Datei (alpha1) oder schreibt XML in das in (handle3) angegebene Memory-Objekt. Das übergebene Objekt muss vom Typ _CteNode, ein Dialog, ein Menü oder ein Druck-Objekt sein. Es kann auch ein mit StoOpen() geöffnetes Objekt übergeben werden. Importierte Kachel-, Raster- und Vektorgrafiken (siehe Ressource importieren) können mit StoExport() und StoReadMem() exportiert werden. Ist die in (alpha1) angegebene Datei bereits vorhanden, wird sie überschrieben.
Als Option kann _XmlSaveDefault (0) oder _XmlSavePure (1) angegeben werden. Standardmäßig erfolgt eine formatierte (mit Leerzeichen und Zeilenwechsel versehene) Ausgabe (int2 =_XmlSaveDefault). Mit _XmlSavePure wird keine Formatierung durchgeführt.
Wird in (handle3) ein Memory-Objekt angegeben, wird der Dateiname ignoriert und der Inhalt in das Objekt geschrieben. Der Inhalt wird an den bestehenden Inhalt angehängt. Sofern das Memory-Objekt schon Daten enthält, muss seine in (int4) angegebene Zeichenkodierung mit der bereits existierenden (Eigenschaft Charset) übereinstimmen. Ist dies nicht der Fall wird der Laufzeitfehler _ErrHdlInvalid erzeugt.
Bei der Angabe einer Zeichencodierung werden alle Zeichenketten in den Zeichencode gewandelt. Zusätzlich wird in dem Knoten des Dokuments (ID = _XmlNodeDocument) das Attribut "encoding" auf die entsprechende Zeichencodierung gesetzt.
Wird in (int5) ein Quellzeichensatz angegeben, wird der Inhalt in von diesem in den in (int4) angegebenen Zielzeichensatz oder den CONZEPT 16-Zeichensatz konvertiert. Ist kein Quellzeichensatz angegeben, wird der CONZEPT 16-Zeichensatz als Quellzeichensatz verwendet.
Konnte die externe Datei nicht geschrieben werden, wird ein _ErrFsi...-Fehlerwert zurückgegeben.
Beispiel:
sub WriteXML
(
aHdlMem : handle;
)
local
{
tXMLDoc : handle;
tXMLItemRoot : handle;
tXMLItem : handle;
tErr : int;
}
{
// XML-Dokument als Cte-Knoten anlegen
tXMLDoc # CteOpen(_CteNode);
// Cte-Knoten als XML-Dokument deklarieren
tXMLDoc->spID # _XmlNodeDocument;
// Standalone-Dokumentdeklaration
tXMLDoc->CteInsertNode('standalone', _XmlNodeAttribute, 'yes', _CteAttrib);
// Dokumenttyp-Deklaration
tXMLDoc->CteInsertNode('myRootElement', _XmlNodeDocumentType, 'SYSTEM "myDTD.dtd"');
// Element (Wurzel)
tXMLItemRoot # tXMLDoc->CteInsertNode('root', _XmlNodeElement, NULL);
// Element
tXMLItem # tXMLItemRoot->CteInsertNode('element', _XmlNodeElement, NULL);
// Attribut
tXMLItem->CteInsertNode('attribute', _XmlNodeAttribute, 'attrib-value', _CteAttrib);
// Kommentar
tXMLItemRoot->CteInsertNode('', _XmlNodeComment, 'comment');
// Text
tXMLItemRoot->CteInsertNode('', _XmlNodeText, 'text');
// CDATA
tXMLItemRoot->CteInsertNode('', _XmlNodeCDATA, 'CDATA');
// XML-Dokument in MemoryObjekt ablegen
tErr # tXMLDoc->XmlSave('', _XmlSaveDefault, aHdlMem, aHdlMem->spCharset);
// Cte-Knoten leeren freigeben
tXMLDoc->CteClear(true);
tXMLDoc->CteClose();
// Fehler bei XMLSave()
if (tErr != _ErrOk)
{
// ...
}
}
Das Resultat sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE myRootElement SYSTEM "myDTD.dtd">
<root>
<element attribute="attrib-value"/>
<!--comment-->
text
<![CDATA[CDATA]]>
</root>
Mögliche Laufzeitfehler:
_ErrHdlInvalid: Einer der übergebenen Deskriptoren ist ungültig._ErrValueInvalid: In (int2) ist ein ungültiger Wert oder das angegebene Memory-Objekt verfügt über einen anderen Zeichensatz als in (int4) angegeben.