DOM 3 Load and Save
molily
- javascript
0 Thomas J.S.0 molily
Hallo,
Opera 7.6 https://forum.selfhtml.org/?t=87969&m=525965 unterstützt neuerdings neben Microsofts XMLHTTPRequest-Quasistandard http://msdn.microsoft.com/library/en-us/xmlsdk/html/xmobjPMEXMLHttpRequest.asp den W3C-Standard DOM 3 Load and Save http://www.w3.org/TR/DOM-Level-3-LS/load-save.html. Ich habe einige Tests durchgeführt:
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>DOM 3 Load & Save Test</title>
</head>
<body>
<script type="text/javascript">
// <![CDATA[
// Parser erzeugen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSParser
var parser = document.implementation.createLSParser(1, null);
try {
// XHTML-Dokument aus externer Quelle einlesen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSParser-parseURI
var doc = parser.parseURI('beispiel.xhtml');
// doc ist ein »Document«-Objekt gemäß DOM 3 Core
} catch (e) {
alert('parser.parseURI: Fehlercode '+e.code);
}
// Zugriff auf den erzeugten DOM-Baum: Titel ausgeben
alert(doc.getElementsByTagName('title').item(0).firstChild.nodeValue);
// beispiel.xhtml darf keine Dokumenttyp-Deklaration haben, sonst bricht das Parsen mit LSException.PARSE_ERR ab. Woher kommt das?
// Serializer erzeugen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSSerializer
var serializer = document.implementation.createLSSerializer();
// eingelesenen DOM-Baum wieder in Markup umwandeln http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSSerializer-writeToString
var xmlstring = serializer.writeToString(doc);
alert(xmlstring);
// Komplexeres Ausgaben über write http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSSerializer-write
// LSOutput-Objekt erstellen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSOutput / http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSOutput
var output = document.implementation.createLSOutput();
try {
var serialize_result = serializer.write(doc, output);
} catch (e) {
alert('serializer.write: Fehlercode '+e.code);
// Hier kommt 19 (DOMException.NOT_SUPPORTED_ERR), diese Methode unterstützt Opera also nicht
}
if (serialize_result) // serialize_result ist demnach undefined
alert(output);
// Dokument mit HTTP PUT senden http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSSerializer-writeToURI
try {
var serialize_result = serializer.writeToURI(doc, 'beispiel.php');
// Hier kommt 19 (DOMException.NOT_SUPPORTED_ERR), diese Methode unterstützt Opera also nicht
} catch (e) {
alert('serializer.writeToURI: Fehlercode '+e.code);
}
if (serialize_result) // serialize_result ist demnach undefined
alert(output);
// Schade, vielleicht können wir XMLHttpRequest.open für einen PUT-Request benutzen?
var request1 = new XMLHttpRequest();
request1.onreadystatechange = function () {
alert('PUT-Request readyState: '+request1.readyState);
alert('PUT-Request status: '+request1.status);
};
request1.open('PUT', 'beispiel.php', true);
request1.send(xmlstring);
// Schade, es tut sich nichts, der Request wird nicht abgesendet. Ob es wenigstens mit POST geht?
var request2 = new XMLHttpRequest();
// request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Diese Methode kennt Opera nicht. Er sendet immer Content-Type: text/xml; charset=utf-8
fired=0;
request2.onreadystatechange = function () {
if (request2.readyState != 4)
return;
// Huch, onreadystatechange wird drei Mal gefeuert mit readyState==4
alert('POST-Request status: '+request2.status);
alert('POST-Request responseText: '+request2.responseText); // OK
alert('POST-Request responseXML: '+request2.responseXML); // OK
// alert('POST-Request responseBody: '+request2.responseBody); // undefined
// alert('POST-Request responseStream: '+request2.responseStream); // undefined
};
request2.open('POST', 'beispiel.php', true);
// request2.send('data=test'); // application/x-www-form-urlencoded ist wie gesagt nicht möglich
request2.send('<?xml version="1.0" ?><data>test</data>');
// String mit XML-Markup in ein DOM Core »Document«-Objekt parsen
// Zunächst ein passendes LSInput-Objekt erstellen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSInput / http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSInput
var input = document.implementation.createLSInput();
// Die folgenden drei Attribute müssen anscheinend nicht gesetzt werden
input.systemId = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd';
input.publicId = '-//W3C//DTD XHTML 1.0 Strict//EN';
input.encoding = 'ISO-8859-1';
input.stringData = '<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de"><head><title>Testtitel</title></head><body><p>Testabsatz</p></body></html>';
try {
// Parsen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSParser-parse
var doc = parser.parse(input);
// doc ist ein »Document«-Objekt gemäß DOM 3 Core
} catch (e) {
alert('parser.parse: Fehlercode '+e.code);
}
// Zugriff auf den erzeugten DOM-Baum: Titel ausgeben
alert(doc.getElementsByTagName('title').item(0).firstChild.nodeValue);
// ]]>
</script>
</body>
</html>
Vielleicht hat jemand Lust, das zu ergänzen.
Was ich noch nicht verstanden bzw. herausbekommen habe:
Was genau ist der Unterschied zwischen LSInput.characterStream, LSInput.byteStream und LSInput.stringData? Wie kann man die ersten beiden verwenden?
Wie kann man mit LSParserFilter, LSProgressEvent und LSLoadEvent arbeiten?
Allgemeine Tests zu XMLHTTPRequest fände ich ebenfalls interessant.
Mathias
Hallo Mathias,
Opera 7.6 https://forum.selfhtml.org/?t=87969&m=525965 unterstützt neuerdings neben Microsofts XMLHTTPRequest-Quasistandard http://msdn.microsoft.com/library/en-us/xmlsdk/html/xmobjPMEXMLHttpRequest.asp den W3C-Standard DOM 3 Load and Save http://www.w3.org/TR/DOM-Level-3-LS/load-save.html. Ich habe einige Tests durchgeführt:
Hast du auch ausprobiert ob der Request auch über Domaingrenzen hinweg Funktioniert? Ich denke dabei an meine Probleme mit dem XMLHTTPRequest in IE und Mozilla (http://forum.de.selfhtml.org/archiv/2004/8/87823/#m522713)
Sollte
Gute Seite ist
http://www.scss.com.au/scripts/xmlhttprequest.js
http://developer.apple.com/internet/webcontent/xmlhttpreq.html
Wenn ich es richtig lese ist "characterStream" unter ECMA-Script nicht verfügbar (bzw. hat keine vorgegebene Bedeutung -->siehe LSReader).
http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSInput-byteStream
Und wenn man dann wirklich alles wissen will leist man hier: http://www.dom4j.com/w3cdomloadandsave/dom3_49.html ;-)
Grüße
Thomas
Hallo,
Hast du auch ausprobiert ob der Request auch über Domaingrenzen hinweg Funktioniert?
Wie im Mozilla funktioniert dies nicht. Es kommt ein JavaScript-Fehler »Security violation«.
Inkonsequent ist das natürlich, Scripte und CSS-Stylesheets aus anderen Zonen zuzulassen, XML-Daten und XSLT-Stylesheets hingegen nicht...
Mathias
Hallo,
Hast du auch ausprobiert ob der Request auch über Domaingrenzen hinweg Funktioniert?
Wie im Mozilla funktioniert dies nicht. Es kommt ein JavaScript-Fehler »Security violation«.
Inkonsequent ist das natürlich, Scripte und CSS-Stylesheets aus anderen Zonen zuzulassen, XML-Daten und XSLT-Stylesheets hingegen nicht...
Eben deshalb wunderte ich mich.
Nach etwas herumexperimentieren und lesen, weiss ich, dass das im Mozilla nicht zwischen verschiedenen Hosts geht (er braucht z.B. bei auch schon bei einer file:/// --> http:// verbindung hierfür Privilegien.) Im IE kann man aber eine Verbindung aufbauen (noch ohne SP2 für XP ;-)).
Grüße
Thomas