2016-12-28 2 views
-2

Was ich tue ist, den Text innerhalb der <To> Tags einer XML-Datei (unten) zu erhalten und es in einem Array in einer anderen PHP-Datei zu speichern. Ich bin mit diesem Code:<und> verhindern, dass Text im Array gespeichert wird

<?php 
    $email = simplexml_load_file($path); 
    foreach($email->thread as $thread){ 
      foreach($thread->email as $text){ 
       $recipients[] = $text->To; 
      } 
    } 
    print_r($recipients); 
?> 

Was im Browser sichtbar ist, ist ein Array mit Adressen gefüllt, aber für das Array-Element des unter XML nur ein, (Komma) ist sichtbar, wie die Adressen innerhalb &lt; und &gt; Codes werden nicht im Array gespeichert.

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <thread> 
     <name></name> 
     <email> 
     <EmailID></EmailID> 
     <From></From> 
     <To>&lt;[email protected]&gt; , &lt;[email protected]&gt;</To> 
     <Subject></Subject> 
     <Text> 
      <content> </content>   
     </Text> 
     </email> 
    </thread> 
</root> 

MY CURRENT OUTPUT IN BROWSER:

Array ([0] => SimpleXMLElement Objekt ([0] => [email protected]) [1 ] => simplexmlelement-Objekt ([0] => discussiere @ apps.ietf.org, jpalme @ dsv.su.se) [2] => simplexmlelement-Objekt ([0] => terry allen) [3] => simplexmlelement-Objekt ([0] =>,) ... usw.

+2

ich es, weil es denkt '<[email protected]>' ist ein Kind-Knoten von '' vorstellbar werde. Haben Sie Zugriff auf alles, was das XML erzeugt? Die Werte im XML-Dokument sollten wirklich in '' Tags eingeschlossen sein. – Tom

+2

Sie sprechen von einer XML-Datei, zeigen aber Code, der sich auf eine Datenstruktur "$ email" bezieht. Wo ist die Verbindung? – trincot

+0

@ L.D Bitte überprüfen Sie meinen Kommentar - könnte das das Problem sein? – Tom

Antwort

-1

Sie können die Funktion SimpleXML_load_string() verwenden, die dies ermöglicht XML zu einem Objekt. Dann wandle das Objekt mit json_encode ($ obj) in JSON um und dekodiere es, um das Array zu erhalten (json_decode()).

+0

Diese Antwort kann auch als Kommentar gegeben werden. –

1

PHP behandelt <[email protected]> als untergeordneten Knoten von <To> - so gibt es keinen Wert zu speichern.

Sie haben ein paar Optionen, die ideale Methode besteht darin, das XML so zu bearbeiten, dass die Knotenwerte in <![CDATA[ ... ]]> Tags eingeschlossen werden. Dadurch wird sichergestellt, dass der Wert im Knoten als Wert und nicht als untergeordneter Knoten behandelt wird.

Alternativ wäre eine hässlichere Lösung zu find the children of the <To> node using children() und dann verwenden Sie die getName() Methode. Dies wird den Knotennamen zurückgeben. Es würde funktionieren, aber es ist hässlich.

Bearbeiten: Alternativ können Sie verweisen this answer - es erläutert, wie Sie DOM verwenden und dann erzwingen das Lesen des Inhalts von <To> als Text.

+0

Die Sache ist, dass ich nicht nur die XML-Datei bearbeiten kann, da der Code mit dem ursprünglichen XML getestet wird. Würde das mit der zweiten Lösung zu einem Problem bei richtigem Text führen, ohne irgendwelche <>? Bedeutung würde Maria noch richtig gespeichert werden? –

+1

Sie müssten ein bisschen Logik einbauen, die prüft, ob _empty_ ist - da es keinen direkten Wert hat. Wenn ja, können Sie schauen, ob es Kinder hat. Das ursprüngliche XML ist falsch und schlecht formatiert - also würde ich mich wirklich darauf konzentrieren, wenn du kannst. – Tom

+0

Ich habe auch ein Beispiel, wo die XML enthält < Hallo & was auch immer. >, <[email protected]>. In diesem Fall wird der, wird innerhalb des Arrays gespeichert, so dass ich nicht weiß, dass PHP es als Kind-Knoten behandelt. –

1

ich zwei Probleme vor Ort hier:

  1. Die SimpleXML Erweiterung nicht regelmäßig Objekte nicht erstellen. Es erstellt dynamisch generierte Objekte, die beim Lesen erweitert werden. Aus diesem Grund können Sie print_r() normalerweise nicht verwenden, um XML-Inhalte zuverlässig zu überprüfen.

  2. In ähnlicher Weise werden Klasseneigenschaften, die XML-Dateien darstellen, dynamisch generiert Objekte, keine Zeichenfolgen. Sie sehen nur Zeichenfolgen aus, weil sie eine interne __toString()-Methode haben, die Textdaten extrahiert, wenn Sie sie in eine Zeichenfolge umwandeln. Dies funktioniert, wenn Sie sie echo aber nicht wenn Sie sie zum Beispiel an ein Array anhängen (weil das eine Cast-Operation nicht auslösen wird).

(Unnötig zu sagen, wenn Sie XML an einen Browser Sie es nicht als HTML gerendert bekommen hat, um sicherzustellen, müssen gedruckt werden, entweder durch einen geeigneten Content-Type Header oder durch Prüfen rohe Quelle in dem Browser gesendet, in der Regel durch Schlagen Ctrl + U.)

Ich schlage vor, Sie String selbst Gießen erzwingen:

foreach($email->thread as $thread){ 
    foreach($thread->email as $text){ 
     $recipients[] = (string)$text->To; 
    } 
} 
print_r($recipients); 
Verwandte Themen