Casabalnca: Parsen von xml via ajax

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

  1. 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

    1. 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ß

  2. 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

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      danke für die ausführliche Antwort.

      Gruß