Ankündigung

Einklappen
Keine Ankündigung bisher.

XML auslesen mit mehreren gleichen Nodes

Einklappen

Neue Werbung 2019

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

  • XML auslesen mit mehreren gleichen Nodes

    Ich suche nach einer Möglichkeit eine xml Datei auszulesen, die mehrere Segmente gleichen Names enthält. Hier ein Beispiel:

    Code:
    <SHP_OBDLV_SAVE_REPLICA02>
        <IDOC BEGIN="1">
            <E1SHP_OBDLV_SAVE_REPLICA SEGMENT="1">
                <E1BPADR1 SEGMENT="1">
                    <ADDR_NO>2001192521</ADDR_NO>
                    <NAME>Bla Bla 1</NAME>
                    <CITY>München</CITY>
                    <POSTL_COD1>80922</POSTL_COD1>
                    <STREET>Bahnhofstraße</STREET>
                    <HOUSE_NO>5</HOUSE_NO>
                    <COUNTRY>DE</COUNTRY>
                    <LANGU>D</LANGU>
                    <REGION>05</REGION>
                    <TIME_ZONE>CET</TIME_ZONE>
                    <TRANSPZONE>R08</TRANSPZONE>
                    <E1BPADR11 SEGMENT="1">
                        <COUNTRYISO>DE</COUNTRYISO>
                        <LANGU_ISO>DE</LANGU_ISO>
                        <LANGU_CR>D</LANGU_CR>
                        <LANGUCRISO>DE</LANGUCRISO>
                    </E1BPADR11>
                </E1BPADR1>
                <E1BPADR1 SEGMENT="1">
                    <ADDR_NO>2001192521</ADDR_NO>
                    <NAME>Bla Bla 2</NAME>
                    <CITY>Berlin</CITY>
                    <POSTL_COD1>10299</POSTL_COD1>
                    <STREET>Hauptstraße</STREET>
                    <HOUSE_NO>5</HOUSE_NO>
                    <COUNTRY>DE</COUNTRY>
                    <LANGU>D</LANGU>
                    <REGION>05</REGION>
                    <TIME_ZONE>CET</TIME_ZONE>
                    <TRANSPZONE>R08</TRANSPZONE>
                    <E1BPADR11 SEGMENT="1">
                        <COUNTRYISO>DE</COUNTRYISO>
                        <LANGU_ISO>DE</LANGU_ISO>
                        <LANGU_CR>D</LANGU_CR>
                        <LANGUCRISO>DE</LANGUCRISO>
                    </E1BPADR11>
                </E1BPADR1>
                <E1BPADR1 SEGMENT="1">
                    <ADDR_NO>2001206840</ADDR_NO>
                    <NAME>Bla Bla 3</NAME>
                    <CITY>Hamburg</CITY>
                    <POSTL_COD1>22014</POSTL_COD1>
                    <STREET>Hafenstraße</STREET>
                    <HOUSE_NO>5</HOUSE_NO>
                    <COUNTRY>DE</COUNTRY>
                    <LANGU>N</LANGU>
                    <REGION>05</REGION>
                    <TIME_ZONE>CET</TIME_ZONE>
                    <E1BPADR11 SEGMENT="1">
                        <E_MAIL>bal.bla@bla.com</E_MAIL>
                        <COUNTRYISO>DE</COUNTRYISO>
                        <LANGU_ISO>NL</LANGU_ISO>
                        <LANGU_CR>D</LANGU_CR>
                        <LANGUCRISO>DE</LANGUCRISO>
                    </E1BPADR11>
                </E1BPADR1>
    Wie zu erkennen ist, kommen <E1BPADR1> mehrfach vor und besitzen auch keine Attribute, anhand derer man sie unterscheiden könnte. Wie kann ich die einzelnen Segmente ansprechen und auslesen?

    Bisher habe ich mit simpleXML versucht eine Lösung zu finden. Hier ein Beispiel:

    PHP-Code:
    $xml_test simplexml_load_file("delivery_1.xml");

    echo 
    "Auftragsnummer: "$xml_test->IDOC->E1SHP_OBDLV_SAVE_REPLICA->
    E1BPOBDLVHDR->DELIV_NUMB "<br>";
    echo 
    "Route: "$xml_test->IDOC->E1SHP_OBDLV_SAVE_REPLICA->
    E1BPOBDLVHDR->ROUTE "<br>";
    echo 
    "Name: "$xml_test->IDOC->E1SHP_OBDLV_SAVE_REPLICA->
    E1BPOBDLVHDR->E1BPADR1[0]->NAME "<br>"

  • #2
    Was willst du denn genau machen?
    Das ist mir aus deinem Posting nicht ganz klar.
    Generell kannst du sowas einfach in einer Schleife abarbeiten.

    Kommentar


    • #3
      Ein Beispiel mit DOMDocument aus einer Klasse zum automatisierten Aktualisieren einer Sitemap beim Löschen eines Blog-Beitrages in einem CMS - das Prinzip ist evtl. das was du suchst, mehrere gleichartige Elemente aus einer XML-Datei auszulesen und dann anhand bestimmter Werte ihrer Kindsknoten zu unterscheiden:

      PHP-Code:
      // delete article node from sitemap

      $urls $sitemap->getElementsByTagName'url' );

      foreach ( 
      $urls as $url ) {

          if ( 
      $url->getElementsByTagName'loc' )[ ]->nodeValue === $article->getPath() ) {

              
      $url->parentNode->removeChild$url );
              break;
          }
      }

      $sitemap->save$this->sitemapPath ); 
      Die entsprechenden Methoden von SimpleXML aus der Doku kannst du dir selbst raussuchen: http://php.net/manual/de/book.simplexml.php

      Kommentar


      • #4
        Danke schonmal für das Feedback und für den Hinweis mit DOMDocument (getElementByTagName). Ich werde das morgen testen. Was ich damit machen möchte ist folgendes:

        1. In einem Verzeichnis sollen neu abgelegte xml Dateien ausgelesen und dann bspw. mit einer zusätzlichen Endung wie ".ok" als "gelesen" markiert werden.
        2. Die Inhalte der Datei sollen in eine Datenbank ablegen werden
        2.1 Ich brauche hier aber nur immer das erste Segment von bspw.
        E1BPADR1, weshalb ich nach einer Lösung suche auch nur das auszulesen.
        3. Aktuell kann ich gar kein Segment auslesen, was mehrfach vorkommt.

        Kommentar


        • #5
          Schau dir XPath an. (DOMXPath)

          Kommentar


          • #6
            Liefert nur den ersten Node aller E1BPADR1:
            PHP-Code:
            $oDOM = new DOMDocument;
            $oDOM->load'your-file.xml' );

            $oXPath = new DOMXPath$oDOM );
            $oNode $oXPath->query'//E1BPADR1' )->item(0); 
            Den kompletten Node als String erhält man bspw. so:
            PHP-Code:
            $sNode $oNode->ownerDocument->saveHTML$oNode ); 
            Tutorial zu DOMDocument/DOMXPath: http://www.php-rocks.de/thema/74-ein...-domxpath.html
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar

            Lädt...
            X