Probleme mit xml_load_file

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit xml_load_file

    Ich habe da eine datei.xml und die sieht auch sehr konform aus:

    Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <ItemList>
    3. <To>2</To>
    4. <From>Main</From>
    5. <MessageNo>14</MessageNo>
    6. <ReceivedNo>0</ReceivedNo>
    7. <ArtikelStatus>
    8. <Filter>
    9. <Period>2009-02-13T15:12:26</Period>
    10. <Artikel>77f3d73a-f922-11dd-a163-001bfcdc5b9f</Artikel>
    11. <Status>1</Status>
    12. <JobID>17200003</JobID>
    13. <Beginn>2009-02-23T00:00:00</Beginn>
    14. <Ende>2009-02-23T00:00:00</Ende>
    15. </Filter>
    16. <Records>
    17. <Record>
    18. <Period>2009-02-13T15:12:26</Period>
    19. <Artikel>77f3d73a-f922-11dd-a163-001bfcdc5b9f</Artikel>
    20. <Status>1</Status>
    21. <JobID>17200003</JobID>
    22. <Beginn>2009-02-23T00:00:00</Beginn>
    23. <Ende>2009-02-23T00:00:00</Ende>
    24. <Menge>1</Menge>
    25. <Bestellnummer>0</Bestellnummer>
    26. <Bestelldatum>0001-01-01T00:00:00</Bestelldatum>
    27. <Bestatigtdatum>0001-01-01T00:00:00</Bestatigtdatum>
    28. <ArtikelNr>170001000111004</ArtikelNr>
    29. </Record>
    30. </Records>
    31. </ArtikelStatus>
    32. </ItemList>
    Alles anzeigen


    Diese Datei möchte ich mit dem Script in der Datei import.php analysieren und verarbeiten:

    Quellcode

    1. <?php
    2. set_time_limit(0);
    3. require_once 'simplexml.class.php';
    4. $file = 'datei.xml';
    5. $sxml = new simplexml;
    6. $data = $sxml->xml_load_file($file,"array");
    7. echo $data;
    8. include 'dbconnect.php';
    9. foreach ($data["ItemList"]["ArtikelStatus"] as $ArtikelStatus)
    10. {
    11. echo $ArtikelStatus;
    12. $Status = (int)trim($ArtikelStatus["Records"]["Record"]["Status"]);
    13. $JobNr = (int)trim($ArtikelStatus["Records"]["Record"]["JobID"]);
    14. $Menge = (int)trim($ArtikelStatus["Records"]["Record"]["Menge"]);
    15. $ArtikelNr = (int)trim($ArtikelStatus["Records"]["Record"]["ArtikelNr"]);
    16. $BeginnDate = $ArtikelStatus["Records"]["Record"]["Beginn"];
    17. $bestandNr = (int) substr($ArtikelNr, 1 , 6);
    18. $categoryNr = (int) substr($ArtikelNr, 7 , 6);
    19. $artikelNr = (int) substr($ArtikelNr, 13 , 6);
    20. $bestandNr = str_pad($bestandNr,6,"0",STR_PAD_LEFT);
    21. $categoryNr = str_pad($categoryNr,6,"0",STR_PAD_LEFT);
    22. $artikelNr = str_pad($artikelNr,3,"0",STR_PAD_LEFT);
    23. $BeginnJahr = substr($BeginnDate, 1 , 4);
    24. $BeginnMonat = substr($BeginnDate, 6 , 2);
    25. $BeginnTag = substr($BeginnDate, 9 , 2);
    26. $dateshort = $BeginnJahr.$BeginnMonat.$BeginnTag;
    27. $sql = "UPDATE calendar SET status = '$Status', menge = '$Menge' WHERE bestandNr = '$bestandNr' AND categoryNr = '$categoryNr' AND artikelNr = '$artikelNr' AND dateshort = '$dateshort'";
    28. mysql_query($sql) or die(mysql_error());
    29. }
    30. echo "IMPORT 1 ERFOLGREICH!<br>";
    31. mysql_close();
    32. ?>
    Alles anzeigen


    da kommt dann der Fehler:

    Cannot open xml document:

    und in der phplog steht: PHP Fatal error: Cannot use string offset as an array in C:\apachefriends\htdocs\dev\import1.php on line 16

    ist die xml Datei vielleicht doch nicht konform? Oder was habe ich hier übersehn?

    Liebe Grüße

    kingluui
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • kingluui verwendet soweit ich das einschätzen kann SimpleXML for PHP4. Somit wäre die Initiierung korrekt. Erste Maßnahme wäre, falls PHP5 bereitsteht, auf die native SimpleXML-Unterstützung zurückzugreifen.

    Auszug aus der Datei simplexml.class.php:

    Quellcode

    1. $data = file_get_contents($file);
    2. if (!$data)
    3. return 'Cannot open xml document: ' . (isset($php_errormsg) ? $php_errormsg : $file);


    Hier kann man also feststellen, dass der Fehler nur dann entsteht, wenn die Datei nicht geöffnet werden kann. Du weißt also jetzt wo du anpacken musst. ;)
    Stelle sicher, dass sich das XML-Dokument wirklich im aktuellen Arbeitsverzeichnis befindet oder arbeite mit einer absoluten Pfadangabe und prüfe ob die Datei lesbar ist:

    Quellcode

    1. if (!defined('__DIR__')) {
    2. define('__DIR__', dirname(__FILE__).DIRECTORY_SEPARATOR);
    3. }
    4. $file = __DIR__.'datei.xml';
    5. //--------------------------------------------------
    6. if (!is_readable($file)) {
    7. die('Datei ist nicht lesbar!');
    8. }
    9. var_dump(file_get_contents($file));
    10. //--------------------------------------------------
    11. $sxml = new simplexml;
    12. $data = $sxml->xml_load_file($file, 'array');
    Alles anzeigen
    MfG dynambee

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von dynambee ()

  • Hallo liebe Leute,

    vielen Dank für die viele Mühe, jetzt begreift ich garnix mehr, jetzt meldet mir der IE folgendes:

    Die XML-Seite kann nicht angezeigt werden
    Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.


    --------------------------------------------------------------------------------

    Ungültig auf der obersten Ebene im Dokument. Fehler beim Bearbeiten der Ressource 'http://www.la-kundenlogin.de/dev/import1...

    string(1533) "<?xml version="1.0" encoding="utf-8"?>
    ^

    genau das
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • Also der Fehler kommt mit dieser Lösung:

    Quellcode

    1. if (!defined('__DIR__')) {
    2. define('__DIR__', dirname(__FILE__).DIRECTORY_SEPARATOR);
    3. }
    4. $file = __DIR__.'datei.xml';
    5. //--------------------------------------------------
    6. if (!is_readable($file)) {
    7. die('Datei ist nicht lesbar!');
    8. }
    9. var_dump(file_get_contents($file));
    10. //--------------------------------------------------
    11. $sxml = new simplexml;
    12. $data = $sxml->xml_load_file($file, 'array');
    Alles anzeigen


    Ich habe die letzte xammp Umgebung auf dem Rechner und die curl Erweiterung aktiviert, natürlich Apache neu gestartet, alles andere Funktioniert bestens.
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • Ok, das funktioniert irgendwie auch nicht, aber wenn ich folgendes Script starte, dann bekomme ich eine Tabelle angezeigt mit allen Informationen drin, also mein PHP5 müsste demnach ja einwandfrei laufen:

    Quellcode

    1. <html>
    2. <head>
    3. <title>Die Struktur einer XML-Datei parsen</title>
    4. </head>
    5. <body>
    6. <h1>Strukur einer XML-Datei</h1>
    7. <?
    8. $xml_parser = xml_parser_create(); // erzeugt neuen Parser
    9. $daten = implode (file ("datei.xml"), ""); // file() liest die Datei in ein Array ein
    10. xml_parse_into_struct ($xml_parser, $daten, &$werte, &$index); // parst XML-Datei in assoziativen Array
    11. xml_parser_free ($xml_parser);
    12. ?>
    13. <table border="1" width="80%">
    14. <tr>
    15. <th>Tag</th>
    16. <th>Typ</th>
    17. <th>Ebene</th>
    18. <th>Wert</th>
    19. </tr>
    20. <?
    21. foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
    22. print "<tr>";
    23. print "<td>".$w["tag"]."</td>";
    24. print "<td>".$w["type"]."</td>";
    25. print "<td>".$w["level"]."</td>";
    26. print "<td>".$w["value"]."</td>";
    27. print "</tr>";
    28. }
    29. ?>
    30. </table>
    31. </body>
    32. </hmtl>
    Alles anzeigen


    die XML Datei sieht so aus:

    Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <ItemList>
    3. <To>2</To>
    4. <From>Main</From>
    5. <MessageNo>14</MessageNo>
    6. <ReceivedNo>0</ReceivedNo>
    7. <ArtikelStatus>
    8. <Filter>
    9. <Period>2009-02-13T15:12:26</Period>
    10. <Artikel>77f3d73a-f922-11dd-a163-001bfcdc5b9f</Artikel>
    11. <Status>1</Status>
    12. <JobID>17200003</JobID>
    13. <Beginn>2009-02-23T00:00:00</Beginn>
    14. <Ende>2009-02-23T00:00:00</Ende>
    15. </Filter>
    16. <Records>
    17. <Record>
    18. <Period>2009-02-13T15:12:26</Period>
    19. <Artikel>77f3d73a-f922-11dd-a163-001bfcdc5b9f</Artikel>
    20. <Status>1</Status>
    21. <JobID>17200003</JobID>
    22. <Beginn>2009-02-23T00:00:00</Beginn>
    23. <Ende>2009-02-23T00:00:00</Ende>
    24. <Menge>1</Menge>
    25. <Bestellnummer>0</Bestellnummer>
    26. <Bestelldatum>0001-01-01T00:00:00</Bestelldatum>
    27. <Bestatigtdatum>0001-01-01T00:00:00</Bestatigtdatum>
    28. [b]<ArtikelNr>170001000111004</ArtikelNr>[/b]
    29. </Record>
    30. </Records>
    31. </ArtikelStatus>
    32. </ItemList>
    Alles anzeigen


    Also Ausgabe bekomme ich eine schöne Tabelle mit allen Infos und Level usw. angezeigt, wie kann ich nun z.B. mit diesem Script nur auf die Informationen im Tag ArtikelNr zugreifen, dazu bräuchte ich eine Lösung, analog dazu käme ich ja dann auch an die anderen Infos ran.

    Bitte noch einmal um Hilfe.
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • Ich habe mich jetzt erstmal hierfür entschieden:

    Quellcode

    1. <?
    2. $xml_parser = xml_parser_create(); // erzeugt neuen Parser
    3. $daten = implode (file ("datei.xml"), ""); // file() liest die Datei in ein Array ein
    4. xml_parse_into_struct ($xml_parser, $daten, &$werte, &$index); // parst XML-Datei in assoziativen Array
    5. xml_parser_free ($xml_parser);
    6. ?>
    7. <?
    8. foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
    9. if ($w["tag"] == "STATUS") {
    10. echo "Status: ".$w["value"]."<br>";
    11. }
    12. }
    13. ?>
    Alles anzeigen


    Da kommt wenigsten schonmal ein Ergebnis bei raus:

    Status: 1
    Status: 1

    Allerdings, da die XML Datei ja so aufgebaut ist:

    Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <ItemList>
    3. <To>2</To>
    4. <From>Main</From>
    5. <MessageNo>14</MessageNo>
    6. <ReceivedNo>0</ReceivedNo>
    7. <ArtikelStatus>
    8. <Filter>
    9. <Period>2009-02-13T15:12:26</Period>
    10. <Artikel>77f3d73a-f922-11dd-a163-001bfcdc5b9f</Artikel>
    11. <Status>1</Status>
    12. <JobID>17200003</JobID>
    13. <Beginn>2009-02-23T00:00:00</Beginn>
    14. <Ende>2009-02-23T00:00:00</Ende>
    15. </Filter>
    16. <Records>
    17. <Record>
    18. <Period>2009-02-13T15:12:26</Period>
    19. <Artikel>77f3d73a-f922-11dd-a163-001bfcdc5b9f</Artikel>
    20. <Status>1</Status>
    21. <JobID>17200003</JobID>
    22. <Beginn>2009-02-23T00:00:00</Beginn>
    23. <Ende>2009-02-23T00:00:00</Ende>
    24. <Menge>1</Menge>
    25. <Bestellnummer>0</Bestellnummer>
    26. <Bestelldatum>0001-01-01T00:00:00</Bestelldatum>
    27. <Bestatigtdatum>0001-01-01T00:00:00</Bestatigtdatum>
    28. <ArtikelNr>170001000111004</ArtikelNr>
    29. </Record>
    30. </Records>
    31. </ArtikelStatus>
    32. </ItemList>
    Alles anzeigen


    erscheint z.B. der Tag Status zwei mal, kann ich die Tags nicht irgendwie genauer ansteuern? Weil die Infos brauche ich jeweils nur einmal.
    Man muss nicht wissen wie es geht, man muss nur wissen wo es steht! Natürlich bei easy-coding 8o de
  • Du kannst genauso gut über ein Objekt iterieren:

    Quellcode

    1. foreach($xml->ArtikelStatus as $ArtikelStatus) {
    2. $Status = (int)trim($ArtikelStatus->Records->Record->Status);
    3. $JobNr = (int)trim($ArtikelStatus->Records->Record->JobID);
    4. $Menge = (int)trim($ArtikelStatus->Records->Record->Menge);
    5. $ArtikelNr = (int)trim($ArtikelStatus->Records->Record->ArtikelNr);
    6. $BeginnDate = $ArtikelStatus->Records->Record->Beginn;
    7. $bestandNr = (int) substr($ArtikelNr, 1 , 6);
    8. $categoryNr = (int) substr($ArtikelNr, 7 , 6);
    9. $artikelNr = (int) substr($ArtikelNr, 13 , 6);
    10. $bestandNr = str_pad($bestandNr,6,"0",STR_PAD_LEFT);
    11. $categoryNr = str_pad($categoryNr,6,"0",STR_PAD_LEFT);
    12. $artikelNr = str_pad($artikelNr,3,"0",STR_PAD_LEFT);
    13. $BeginnJahr = substr($BeginnDate, 1 , 4);
    14. $BeginnMonat = substr($BeginnDate, 6 , 2);
    15. $BeginnTag = substr($BeginnDate, 9 , 2);
    16. $dateshort = $BeginnJahr.$BeginnMonat.$BeginnTag;
    17. }
    Alles anzeigen
    MfG dynambee