Parsen von xml via ajax
    
Casabalnca
    
    
      
    
  - javascript
- xml
 nicht angemeldet
 nicht angemeldetHallo,
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ß