Ankündigung

Einklappen
Keine Ankündigung bisher.

Zwei XML Dateien vergleichen

Einklappen

Neue Werbung 2019

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

  • Zwei XML Dateien vergleichen

    Hallo

    Ich hab folgendes Problem. Ich hab zwei exakt gleich strukturierte XML Dateien aus zwei unterschiedlichen Systemen mit unterschiedlichen Daten. Die Struktur ist aber immer die folgende:


    <item>
    <Name>item1</Name>
    <ID>12345</ID>
    <attribut1>blablabla</attribut1>
    <attribut2>10</attribut2>
    </item>
    <item>
    <Name>item2</Name>
    <ID>67890</ID>
    <attribut1>blablabla</attribut1>
    <attribut2>30</attribut2>
    </item>

    Ich habe nun beide XML Dateien mit simplexml_load_file() in zwei Variablen gespeichert:
    $xml1 = simplexml_load_file('loadfile1.xml');
    $xml2 = simplexml_load_file('loadfile2.xml');

    Mit forearch kann ich beide am Bildschirm ausgeben lassen.
    Ich möchte nun aber alle Werte von $xml1 anzeigen lassen und untersuchen ob ein Item, anhand der ID, im File $xml2 vorkommt und dort ein anderes attribut2 hat. Dieses soll dann auch neben dem attribut2 von $xml1 angegeben werden.

    Bin derzeit ratlos wie ich diese Suchaktion am Besten durchführen kann.

    Vielen Dank für eure Hilfe!

  • #2
    mal kurz probiert:

    muss korrektes xml sein, habe daher noch ein umfassendes tag mit eingeschleust.
    domparser ist da ein wenig kräftiger. vielleicht bringts dich weiter...

    PHP-Code:
    <?php

    $doc1 
    = new DOMDocument();
    $doc2 = new DOMDocument();
    $doc1->load('xml1.xml');
    $doc2->load('xml2.xml');

    $searchNode1 $doc1->getElementsByTagName"item" );
    $searchNode2 $doc2->getElementsByTagName"item" );

    $valueArr=array();

    //die attribut2 values der datei xml2.xml in ein array reinhängen
    foreach ($searchNode2 as $s2) {
      
    $valueArr[] = $s2->getElementsByTagName"attribut2" )->item(0)->nodeValue;     
    }

    $i=0;
    foreach( 
    $searchNode1 as $s1 )
    {
      
    $value $s1->getElementsByTagName"attribut2" )->item(0)->nodeValue;
        
      echo  
    $value."<br />"
      echo 
    $valueArr[$i]."<br />";

    //vergleiche die entsprechenden werte aus dem array mit den aktuellen 
    //aus xml1.xml, wenn unterschiedlich, hänge sie zusammen und setze sie in den knoten
      
    if(strcasecmp($value$valueArr[$i]))
        
    $s1->getElementsByTagName"attribut2" )->item(0)->nodeValue $value." "$valueArr[$i];
      
    $i++;
        


    echo 
    $doc1->saveXML();
    ?>
    bei folgender struktur der beiden xml seiten:
    Code:
    <?xml version="1.0"?>
    <jep>
    <item>
    <Name>item1</Name>
    <ID>12345</ID>
    <attribut1>blablabla</attribut1>
    <attribut2>10</attribut2>
    </item>
    <item>
    <Name>item2</Name>
    <ID>67890</ID>
    <attribut1>blablabla</attribut1>
    <attribut2>30</attribut2>
    </item>
    </jep>

    Kommentar


    • #3
      geht auch per SimpleXML, such dir den Tag Content zusammen den du brauchst und bau daraus ein xPath-Query das du auf das andere SimpleXML-File ausführst, gibt dieses query < 1 zurück, kopier halt die struktur von xml-objekt 1 nach objekt 2 und speicher das ganze per $xml2->asXML in eine datei

      http://de.php.net/manual/de/simplexmlelement.asxml.php
      http://de.php.net/manual/de/simplexm...t.addchild.php
      http://de.php.net/manual/de/simplexmlelement.xpath.php

      was xpath angeht, zum basteln des "notwendigen" xpath-statements hilft dir sicher das weiter:
      http://xpathvisualizer.codeplex.com/
      http://www.w3schools.com/xpath/default.asp

      relativ simpel zu lösen

      Kommentar


      • #4
        Hallo

        Vielen Dank für eure Antworten! Mit Xpath war ich in der Lage die zweite XML Datei auszulesen und den gewünschten Wert gleichzeitig mit der ersten XML Datei anzuzeigen!

        Kommentar

        Lädt...
        X