Announcement

Collapse
No announcement yet.

steh auf dem Schlauch

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • steh auf dem Schlauch

    Hej,

    irgendwie steh ich gerad total aufm dem schlauch.

    also ich hab eine xml datei, die folgende struktur hat:
    Code:
     
    <composers xmlns:uuid="java:java.util.UUID" xmlns="http://www.w3.org/1999/xhtml">
       <composer uuid="bcce743c-f85d-472f-b740-1a5b7e706bc5">
          <name>Aaltoila, Heikki</name>
          <geburtsjahr>1905</geburtsjahr>
          <sterbejahr>1992</sterbejahr>
          <url>http://www.klassika.info/Komponisten/Aaltoila/index.html</url>
       </composer>
    ...
    
    </composers>
    Und nun will erstmal einfach mit xquery alle Komponisten namen ausgeben lassen, was eigentlch mit der folgenden Abfrage gehen sollte:
    Code:
    for $composer in doc("composers_uuid.xml")/composers/composer
    return  $composer/name
    Krieg aber dann eine leere Ausgabe. Also eigentlich sollte ja diese Abfrage voll einfach ist, aber irgendwie seh ich gerad nicht, was ich da falsch mache.

  • #2
    Packe
    Code:
    declare default element namespace "http://www.w3.org/1999/xhtml";
    vor deine Anfrage.

    Comment


    • #3
      Erstmal vielen dank für die Hilfe.
      Ich hab jetzt da mal weiter gemacht und komm wieder auf das selbe problem, dass ich einfach keine Ausgabe kriege. Also ungeachten von der Struktur der beiden XML-Dateien. Ich nehme den Künstler aus einer Datei und suche ihn in der XML, wo Lieder gespeichert sind, um eine Art verknüpfung herzustellen. Jedoch funktioniert es wohl nicht so, wie ich mir das vorstelle, wobe ich mir eigentlich denke, dass die Idee so stimmt:

      Code:
      <TrackArea xmlns="http://www.w3.org/1999/xhtml" >
      {
      for $composer in doc("../Aufgabe2/composers_uuid.xml")/composers/composer
      return
          let $comps := $composer
          for $track in doc("Mediathek.xml")/plist/TrackArea/Track
          return
              if(fn:matches(data($composer), data($track/Composer))) then
                  <Track>
                  <Name type="string">{data($track/Name)}</Name>
                  <UUID type="string">{data($composer/@uuid)}</UUID>
                  </Track>
          (: .... :)
              else
                  <Track>
                  <Name type="string">{data($track/Name)}</Name>
                  <UUID type="string">None</UUID>
                  </Track>
          (:.....:)
      }
      </TrackArea>

      Comment


      • #4
        Warum benutzt du denn
        Code:
        declare default element namespace "http://www.w3.org/1999/xhtml";
        nicht, obwohl es vorgeschlagen wurde?
        Zumindest für die erste Anfrage sollte das helfen. Die zweite Anfrage ist komplexer und scheint auf eine zweites Dokument zuzugreifen, das du gar nicht gezeigt hast. So das zweite Dokument einen anderen Namensraum verwendet, hilfe ein "declare default element namespace" nicht, da muss dann halt zwei verschiedene Namensräume definieren.

        Comment


        • #5
          inwiefern ist
          Code:
          declare default element namespace "http://www.w3.org/1999/xhtml";
          besser, als xmlns Attribut?
          Naja, die andere Datei ist sone Mediathekstadei, die Trackinformationen enthält:
          Code:
          <plist version="1.0">
          <TrackArea>
                <Track>
                   <TrackID type="integer">464</TrackID>
                   <Name type="string">Titel 01</Name>
                   <Kind type="string">AAC-Audiodatei</Kind>
                   <Size type="integer">8244635</Size>
                   <TotalTime type="integer">508733</TotalTime>
                   <TrackNumber type="integer">1</TrackNumber>
                   <TrackCount type="integer">10</TrackCount>
                   <DateModified type="date">2007-08-17T18:33:58Z</DateModified>
                   <DateAdded type="date">2007-08-17T18:33:04Z</DateAdded>
                   <BitRate type="integer">128</BitRate>
                   <SampleRate type="integer">44100</SampleRate>
                   <PlayCount type="integer">7</PlayCount>
                   <PlayDate type="integer">3270873449</PlayDate>
                   <PlayDateUTC type="date">2007-08-25T06:57:29Z</PlayDateUTC>
                   <Normalization type="integer">3084</Normalization>
                   <PersistentID type="string">7ECC146FD9B469EF</PersistentID>
                   <Disabled type="boolean">true</Disabled>
                   <TrackType type="string">File</TrackType>
                   <Location type="string">file://localhost/C:/Users/brueggem/Music/iTunes/iTunes%20Music/Unbekannter%20Interpret/Unbekanntes%20Album/01%20Titel%2001.m4a</Location>
                   <FileFolderCount type="integer">4</FileFolderCount>
                   <LibraryFolderCount type="integer">1</LibraryFolderCount>
                </Track>
          ...
          </plist>
          Wenn ich zu der Mediathek den selben Namespace hinzufüge, wie zu der Composer.xml, dann termniert die Abfrage nicht, was aufjedenfall mal was neues ist ))
          Ich nehme mal an, dass die Schleife irgendwo hängt, da ich nicht glaube, dass ein O(n^2) Algorithmus länger als 5 minuten auf meinem Rechner brauchen sollte ))

          Comment


          • #6
            Mit XQuery selektiert
            Code:
            //bar
            ohne ein declare default element namespace nur Elemente mit lokalem Namen "bar" in keinem Namensraum. In deinem ersten XML-Beispiel sind die Elemente aber in dem Namensraum http://www.w3.org/1999/xhtml, um diese zu selektieren, kann man entweder, wie schon vorgeschlagen
            Code:
            declare default element namespace "http://www.w3.org/1999/xhtml";
            benutzen, dann selektiert //bar nicht mehr "bar"-Elemente in keinem Namensraum, sondern im default element namespace. Oder man definiert in XQuery einen Präfix, also
            Code:
            declare namespace x = "http://www.w3.org/1999/xhtml";
            und benutzt den dann in Pfadausdrücken, um Elementnamen zu qualififzieren:
            Code:
            /x:composers/x:composer
            Da du (zumindest in deinem zweiten Beispiel) auch noch ein Dokument verarbeiten willst, dessen Elemente in keinem Namensraum sind, nützt declare default element namespace nichts bzw. ist sogar schädlich, da man dann nicht mehr auf Element in keinem Namensraum zugreifen kann. Du solltest also für den im ersten Dokument verwendeten Namensraum in XQuery einen Präfix definieren und den dann in Pfadausdrucken verwenden, um Elemente aus diesem Dokument zu selektieren; dann kannst du für die Elemente aus dem zweiten Dokument Pfade ohne Präfix verwenden.

            Comment

            Working...
            X