Parsen von xml via ajax
Casabalnca
- javascript
- xml
Hallo,
ich brauche bei einer Sache eure Hilfe, bei der ich nicht ganz fit bin. Ich habe folgenden xml-Konten, der sich wiederholt:
<url>
<loc>https://test.de</loc>
<lastmod>2021-09-07</lastmod>
<video:video>
<video:content>https://test.mp4</video:content>
<video:title>E-Learning</video:title>
...
</video:video>
</url>
<url>
...
</url>
Ich muss diesen Knoten via ajax parsen. Was ich mich Schwierigkeiten macht, sind die Doppelpunkte bei z.B. video:video und video:content. We sind diese zu behandeln? Ich habe folgenden Code:
<select name="sp_vimp" id="tag_1"></select>
<script type="text/javascript" language="javascript">
$(document).ready(function(){
var x = document.getElementById("tag_1");
$.ajax({
type: "GET",
url: "filme.xml",
dataType: "xml",
success: function(xml){
$(xml).find('url').each(function(){
var sTitle = $(this).find('loc').text();
var option = document.createElement("option");
option.text = sTitle;
x.add(option)
});
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
}
});
});
</script>
Kann mir bitte jemand sagen, wie ich an die Inhalte von video:content und video:title kommen kann.
Danke im Voraus
Hallo,
ich kenne mich mit jquery nicht aus, daher nur eine allgemeine Antwort.
Wenn du auf die Inhalte einer xml-Datei zugreifen willst, kannst du das natürlich mit Stringfunktionen versuchen, aber ich würde einen xml-Parser nehmen. Ist das, was $.ajax liefert, schon geparsed oder ein String.
Ich lese xml-Dateien als String und verwende dann den DOMParser
. Danach kann ich mit den DOM-Funktionen (getElement…) auf die Inhalte zugreifen. Auf Namespace-Elemente kann man dann mit getElementsByTagNameNS
zugreifen. Ich mache es mir da aber einfach: Da ich die xml-Datei ja als Text vorliegen habe, entferne ich vor dem Parsen einfach alle Namespaceangaben, und kann dann wieder die einfachen getElement…- oder oder querySelector-Funktionen verwenden.
Gruß
Jürgen
Hallo Jürgen,
danke für die Antwort. Das was du machst ist relativ aufwendig und dauert glaube ich länger, wenn die xml-Datei groß ist. Ich habe selber eine Lösung gefunden und zwar wie unten:
find('video\\:title').text();
Gruß
Hallo Casabalnca,
du musst das : escapen. Das geschieht mit einem Backslash.
Problem: Einen Backslash musst Du auch in Javascript escapen. Deswegen brauchst Du zwei davon.
Oder Du machst es mit DOM Methoden.
// jQuery - tu so, als sei video:video der tagName
videos = $(this).find("video\\:video");
// DOM - tu das gleiche
videos = this.getElementsByTagName("video:video");
// DOM - suche mit generischem Namespace
video = this.querySelector("*|video");
Die dritte Variante verwendet das CSS Trennsymbol | für Namespaces. Problem ist nur, dass Du einen Namespace in CSS mit @namespace deklarieren musst und das in querySelector nicht geht. Aber wenn keine Kollisionsgefahr besteht, wie hier, kannst Du mit *| sagen: egal welcher Namespace.
jQuery kennt keine CSS Namespaces, $("*|video", xml) crasht.
Rolf
Hallo Rolf,
danke für die ausführliche Antwort.
Gruß