Ankündigung

Einklappen
Keine Ankündigung bisher.

Bestimmte Werte aus XML-Datei auslesen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bestimmte Werte aus XML-Datei auslesen

    Hallo miteinander,

    Ich habe das folgenden XML-Segement:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
      <record xmlns="http://www.loc.gov/MARC21/slim" type="Authority">
        <leader>00000nz  a2200000nc 4500</leader>
        <controlfield tag="001">040432386</controlfield>
        <controlfield tag="003">DE-101</controlfield>
        <controlfield tag="005">20180124053847.0</controlfield>
        <controlfield tag="008">880701n||azznnbabn           | ana    |c</controlfield>
        <datafield tag="024" ind1="7" ind2=" ">
          <subfield code="a">http://d-nb.info/gnd/4043238-5</subfield>
          <subfield code="2">uri</subfield>
        </datafield>
        <datafield tag="035" ind1=" " ind2=" ">
          <subfield code="a">(DE-101)040432386</subfield>
        </datafield>
        <datafield tag="035" ind1=" " ind2=" ">
          <subfield code="a">(DE-588)4043238-5</subfield>
        </datafield>
        <datafield tag="035" ind1=" " ind2=" ">
          <subfield code="z">(DE-588c)4043238-5</subfield>
          <subfield code="9">v:zg</subfield>
        </datafield>
        <datafield tag="040" ind1=" " ind2=" ">
          <subfield code="a">DE-101</subfield>
          <subfield code="9">r:DE-101</subfield>
          <subfield code="b">ger</subfield>
          <subfield code="d">9999</subfield>
        </datafield>
        <datafield tag="042" ind1=" " ind2=" ">
          <subfield code="a">gnd1</subfield>
        </datafield>
        <datafield tag="065" ind1=" " ind2=" ">
          <subfield code="a">13.3</subfield>
          <subfield code="2">sswd</subfield>
        </datafield>
        <datafield tag="075" ind1=" " ind2=" ">
          <subfield code="b">s</subfield>
          <subfield code="2">gndgen</subfield>
        </datafield>
        <datafield tag="075" ind1=" " ind2=" ">
          <subfield code="b">saz</subfield>
          <subfield code="2">gndspec</subfield>
        </datafield>
        <datafield tag="079" ind1=" " ind2=" ">
          <subfield code="a">g</subfield>
          <subfield code="q">s</subfield>
          <subfield code="u">w</subfield>
          <subfield code="u">o</subfield>
          <subfield code="u">z</subfield>
        </datafield>
        <datafield tag="083" ind1="0" ind2="4">
          <subfield code="a">751.45</subfield>
          <subfield code="9">d:3</subfield>
          <subfield code="9">t:2007-01-01</subfield>
          <subfield code="2">22/ger</subfield>
        </datafield>
        <datafield tag="150" ind1=" " ind2=" ">
          <subfield code="a">Ölmalerei</subfield>
        </datafield>
        <datafield tag="450" ind1=" " ind2=" ">
          <subfield code="a">Ölgemälde</subfield>
        </datafield>
        <datafield tag="550" ind1=" " ind2=" ">
          <subfield code="0">(DE-101)040372200</subfield>
          <subfield code="0">(DE-588)4037220-0</subfield>
          <subfield code="0">http://d-nb.info/gnd/4037220-0</subfield>
          <subfield code="a">Malerei</subfield>
          <subfield code="4">obal</subfield>
          <subfield code="4">http://d-nb.info/standards/elementset/gnd#broaderTermGeneral</subfield>
          <subfield code="w">r</subfield>
          <subfield code="i">Oberbegriff allgemein</subfield>
        </datafield>
        <datafield tag="670" ind1=" " ind2=" ">
          <subfield code="a">M</subfield>
        </datafield>
        <datafield tag="677" ind1=" " ind2=" ">
          <subfield code="a">Wird i.d.R. nur verwendet, wenn die Maltechnik behandelt ist.</subfield>
        </datafield>
        <datafield tag="750" ind1=" " ind2="7">
          <subfield code="a">Peinture à l'huile</subfield>
          <subfield code="0">(FrPBN)FRBNF119329441</subfield>
          <subfield code="0">http://data.bnf.fr/11932944</subfield>
          <subfield code="2">ram</subfield>
          <subfield code="9">v:MACS-Mapping. Bitte keine Änderungen vornehmen.</subfield>
        </datafield>
        <datafield tag="913" ind1=" " ind2=" ">
          <subfield code="S">swd</subfield>
          <subfield code="i">s</subfield>
          <subfield code="a">Ölmalerei</subfield>
          <subfield code="0">(DE-588c)4043238-5</subfield>
        </datafield>
      </record>
    Mit dem folgenden PHP-Code kann ich bspw. den Datenfeld (datafield) mit dem Tag "450" auslesen. Wie aber komme ich bspw. an den Wert für das "subfield" mit dem Tag "code="0"" unter dem Datenfeld "tag=550"? Jemand eine Idee bitte?


    PHP-Code:
    <?php
                header
    ('Content-type: text/html; charset=utf-8');
            
    error_reporting(E_ALL);
            
    //ini_set('display_errors', '1');
                
    $id preg_replace("/[^0-9-]/"""$_POST["id"]);                
                    
    // URL to fetch
                    
    $url "https://services.dnb.de/sru/authorities?version=1.1&operation=searchRetrieve&query=WOE%3D$id%20and%20COD%3Ds&recordSchema=MARC21-xml";
                
    // Setting the HTTP Request Headers
                    
    $User_Agent 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0';

                    
    $request_headers = array('Contect-Type:text/xml''Accept:text/xml');

                  
    $ch curl_init($url);
                  
    // Set the url
            
    curl_setopt$chCURLOPT_URL$url );
            
    curl_setopt($chCURLOPT_USERAGENT$User_Agent);
                    
    curl_setopt($chCURLOPT_HTTPHEADER$request_headers);
            
    curl_setopt($chCURLOPT_ENCODING"");
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
                    
    // Execute
                    
    $result curl_exec($ch); // Performs the Request, with specified curl_setopt() options (if any).
                    // Closing
            
    curl_close($ch);
                    
    $xmlObj = new SimpleXMLElement($result);

                    foreach(
    $xmlObj->records->record->recordData->record->datafield as $dfield)
            {
                if((string)
    $dfield["tag"] == "150")
        {
            
    $subfield $dfield->subfield;
            echo(
    $subfield) . " ; ";
        }
            }
                    foreach(
    $xmlObj->records->record->recordData->record->datafield as $dfield)
            {
                if((string)
    $dfield["tag"] == "450")
        {
            
    $subfield $dfield->subfield;
            echo(
    $subfield) . " ; ";
        }
            }

    ?>
    Danke für eure Hilfe

  • #2
    Wenn du das Attribut direkt willst: XPath mit Filter und dann das entsprechende Attribut.

    http://php.net/manual/de/simplexmlelement.xpath.php
    http://php.net/manual/de/simplexmlel...attributes.php
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Hallo Hausl,

      danke für die Antwort.

      Ist es nicht möglich das folgende Code-Element zu erweitern umd damit das subfield mit dem code a zu erhalten?:

      PHP-Code:
            foreach($xmlObj->records->record->recordData->record->datafield as $dfield)
              {
                  if((string)
      $dfield["tag"] == "450")
          {
              
      $subfield $dfield->subfield;
              echo(
      $subfield) . " ; ";
          }
              } 


      Ich teste schon eine Weile und komme einfach auf keine Lösung.

      Kommentar


      • #4
        Möglich ist es schon, nur ist XPath wesentlich klarer als verschachtelte Schleifen zu schreiben.

        Kommentar


        • #5
          Ich habe jetzt XPath ausprobiert. Erhalte aber nach wie vor nicht die gewünschte Ausgabe. Wo liegt mein Fehler im folgenden Code?

          PHP-Code:
          $xmlObj2 simplexml_load_file($result);
                   
          $dfield $xmlObj2->xpath('/records/record/recordData/record/datafield');
                   foreach(
          $dfield as $sfield) {
                   
          $id = (string) $sfield->xpath('subfield[@code="a"]')[0];
                   echo 
          $id " : ";

          Danke

          Kommentar


          • #6
            Mit diesem XPath bekommst du die Elemente die du haben willst.

            PHP-Code:
            $xml = new SimpleXMLElement($s);
            $result $xml->xpath('//datafield[@tag="550"]/subfield[@code="0"]');
            foreach (
            $result as $entry) {
                echo 
            $entry[0]."\n";

            gibt:

            Code:
            (DE-101)040372200
            (DE-588)4037220-0
            http://d-nb.info/gnd/4037220-0
            https://eval.in/1059405

            LG

            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Hallo,

              ich habe es jetzt mit deinem Beispiel versucht hausl aber erhalte leider nach wie vor keine Ausgabe wenn ich es über die URL versuche.

              So sieht mein Code aktuell aus:

              PHP-Code:
              <?php
                          header
              ('Content-type: text/html; charset=utf-8');
                      
              error_reporting(E_ALL);
                      
              //ini_set('display_errors', '1');
                          
              $id preg_replace("/[^0-9-]/"""$_POST["id"]);                
                              
              // URL to fetch
                              
              $url "https://services.dnb.de/sru/authorities?version=1.1&operation=searchRetrieve&query=WOE%3D$id%20and%20COD%3Ds&recordSchema=MARC21-xml";
                          
              // Setting the HTTP Request Headers
                              
              $User_Agent 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0';

                              
              $request_headers = array('Contect-Type:text/xml''Accept:text/xml');

                            
              $ch curl_init($url);
                            
              // Set the url
                      
              curl_setopt$chCURLOPT_URL$url );
                      
              curl_setopt($chCURLOPT_USERAGENT$User_Agent);
                              
              curl_setopt($chCURLOPT_HTTPHEADER$request_headers);
                      
              curl_setopt($chCURLOPT_ENCODING"");
                      
              curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
                              
              // Execute
                              
              $result curl_exec($ch); // Performs the Request, with specified curl_setopt() options (if any).
                              // Closing
                      
              curl_close($ch);
                              
              $xmlObj = new SimpleXMLElement($result);

                              foreach(
              $xmlObj->records->record->recordData->record->datafield as $dfield)
                      {
                          if((string)
              $dfield["tag"] == "150")
                  {
                      
              $subfield $dfield->subfield;
                      echo(
              $subfield) . " ; ";
                  }
                      }
                              foreach(
              $xmlObj->records->record->recordData->record->datafield as $dfield)
                      {
                          if((string)
              $dfield["tag"] == "450")
                  {
                      
              $subfield $dfield->subfield;
                      echo(
              $subfield) . " ; ";
                  }
                      }

              $sfield $xmlObj->xpath('//datafield[@tag="550"]/subfield[@code="0"]');
              foreach (
              $sfield as $entry) {
                  echo 
              $entry[0]."\n";
              }

              ?>

              Kommentar


              • #8
                ok, und weiter? Was ist deine Frage?

                Meine ist: Hast du schon debugging betrieben? Lass dir die Fehler mal alle ausgeben (error reporting, dann curl hat sowas, simplexml ebenfalls (-> Doku), mach das mal ob das was hochkommt oder alles klar geht, dann der nächste Schritt je nachdem was da rauskommt .. usw.. Wie man es halt macht beim Programmieren.

                https://php-de.github.io/jumpto/faq/#debugging
                The string "()()" is not palindrom but the String "())(" is.

                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Wenn ich

                  PHP-Code:
                  error_reporting(-1);
                          
                  ini_set('display_errors'true); 
                  zu beginn meines Codes stelle erhalte ich dennoch keine Fehlerausgabe. Auch wenn ich
                  PHP-Code:
                  curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 
                  deaktiviere bekomme ich den gesamten Inhalt der gewünschten XML-Datei auf dem Bildschirm präsentiert. Jedoch nicht die einzelnen Werte oder Fehlermeldungen.

                  Kommentar


                  • #10
                    Wenn ich bspw. denn Code
                    PHP-Code:
                            foreach($xmlObj->records->record->recordData->record->datafield as $dfield)
                            {
                                if((string)
                    $dfield["tag"] == "150")
                        {
                            
                    $subfield $dfield->subfield;
                            echo(
                    $subfield) . " ; ";
                        }
                            }
                                    foreach(
                    $xmlObj->records->record->recordData->record->datafield as $dfield)
                            {
                                if((string)
                    $dfield["tag"] == "450")
                        {
                            
                    $subfield $dfield->subfield;
                            echo(
                    $subfield) . " ; ";
                        }
                            } 
                    verwende, dann erhalte ich die Ausgabe "Ölmalerei ; Ölgemälde ;". Sobald ich dies aber mit der "xpath" Funktion umsetze erhalte ich wieder nur eine leere Seite.

                    Kommentar


                    • #11
                      PHP-Code:
                      $xmlObj->registerXPathNamespace'SIB''http://www.loc.gov/MARC21/slim' );
                      $sfield $xmlObj->xpath'//SIB:datafield[@tag="550"]/SIB:subfield[@code="0"]' ); 
                      https://www.google.de/search?q=xml+n...UTF-8&oe=UTF-8
                      Signaturrrrrrr

                      Kommentar


                      • #12
                        Danke K313. Aber wenn ich diesen Code einfüge bleibt es leider bei der Leerausgabe.

                        Ich habe es mit folgender Variante versucht
                        PHP-Code:
                                    foreach($xmlObj->records->record->recordData->record->datafield as $dfield)
                                {
                                    if((string)
                        $dfield["tag"] == "550")
                            {
                                
                        $subfield $dfield->xpath('/subfield[@code="0"]');
                                echo(
                        $subfield) . " ; ";
                            }
                                } 
                        Hiermit erfolgt schonmal eine Ausgabe "Array ;" leider noch nicht die gewünschte

                        Kommentar


                        • #13
                          Hiermit erfolgt schonmal eine Ausgabe "Array ;"
                          Naja, weil es halt ein Array mit mehreren Einträgen ist. Warum du das in deiner Schleife machst ist mir auch nicht ganz klar. Kopierst du irgendwelchen Code zusammen oder hast du schon eine Ahnung was du da tust? Nur "blind" Code zusammenkopieren bringt nicht viel, wie du siehst, du solltest schon wissen was du tust. Und wenn nicht einlesen in das Thema.
                          The string "()()" is not palindrom but the String "())(" is.

                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Klar ich bin Anfänger habe mich aber schon in das Thema eingearbeitet. Was ich eben gar nicht verstehe ist, das dieser Code
                            PHP-Code:
                                    foreach($xmlObj->records->record->recordData->record->datafield as $dfield)
                                    {
                                        if((string)
                            $dfield["tag"] == "150")
                                {
                                    
                            $subfield $dfield->subfield;
                                    echo(
                            $subfield) . " ; ";
                                }
                                    } 
                            das gewünschte Ergebnis liefert und dieser Code
                            PHP-Code:
                                        foreach($xmlObj->records->record->recordData->record->datafield->subfield as $dfield)
                                    {
                                        if((string)
                            $dfield["code"] == "a")
                                {
                                     
                            $subfield $dfield;
                                    echo(
                            $subfield) . " ; ";
                                }
                                    } 
                            alle subfields mit dem code=a liefert. Sobald ich aber auf ein bestimmtes Feld (also subfield mit code=a unter dem datafield mit dem tag=550) zugreifen möchte, erhalte ich keine Ausgabe mehr obowhl der Xpath-Code von dir doch funzen müsste.

                            Kommentar


                            • #15
                              Mit dem XPath brauchst du doch die äussere Schleife dann gar nicht. Du willst doch alle subfields@code='a' Werte aus den subfields unterhalb des Elements datafield@tag='150'? Und nur diese, oder?
                              The string "()()" is not palindrom but the String "())(" is.

                              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                              PHP.de Wissenssammlung | Kein Support per PN

                              Kommentar

                              Lädt...
                              X