2010-12-01 6 views

Antwort

12

Dies ist einObjekt. Die '@attributes'-Zeile ist eine interne Darstellung des attributes aus dem XML-Element. Verwenden Sie die SimpleXML-Funktionen, um Daten von diesem Objekt zu erhalten, anstatt direkt mit ihm zu interagieren.

+0

Aber warum ist es mit dem Zeichen @ angezeigt? – cambraca

+0

Ich weiß nicht warum. SimpleXML entschied sich dafür, das Array-Element zu benennen, das ich vermute. –

+0

@Rocket Ich finde keine Möglichkeit, @ in einen Variablennamen einzuschließen – cambraca

9

Alle diese Antworten zur Fehlerkontrolle sind falsch. Das @ bedeutet nicht irgendetwas. So wird die Eigenschaft intern aufgerufen, aber verlassen sich nicht auf diese. Verlassen Sie sich beim Umgang mit SimpleXML nicht auf print_r() oder var_dump(). SimpleXML macht viele "magische" Dinge, die nicht korrekt von print_r() und var_dump() dargestellt werden.

Wenn Sie wissen müssen, was "innerhalb" eines XML-Fragments ist, verwenden Sie einfach ->asXML() darauf.

+0

Ja, es scheint, SimpleXMLElement Objekte sind seltsam. –

+0

Dies war auch die richtige Antwort, aber ich kann nicht 2 vergeben :( –

+0

Sie können Ihre vorherige Auswahl abwählen, wann immer Sie die akzeptierte Antwort ändern möchten. Es hilft der Seite gegen ein Riesenrennen, wo zufällige Leute zufällige Antworten zu Themen posten Sie wissen es nicht, nur um sie zu löschen und später zu bearbeiten, wenn sich herausstellt, dass ihre zufällige Antwort nicht korrekt war. –

1

Sorry, kann nicht als Gast kommentieren, aber für jeden anderen, der hier endet, wie ich ... Ich erstelle meine eigenen Joomla-Formularfelder und Joomla erstellt ein sehr "interessantes" Objekt aller möglichen Dinge. Nun wollte ich kein SimpleXML-Experte werden, alles was ich wollte, war der ursprüngliche Etikettentext, der in @attributes weggeworfen wurde.

Nach ein bisschen "hmmm, I wonder if this works?"™ fand ich dies der einfachste Weg, diese Werte zuzugreifen ist:

var_dump($simpleXMLObject); 

/* Result */ 
object(SimpleXMLElement) 
    public '@attributes' => 
    array (size=3) 
     'name' => string 'awesome' 
     'label' => string 'Awesome Label' 
     'type' => string 'typeOfAwesome' 

echo $simpleXMLObject->attributes()->label; // Awesome Label 

$simpleXMLObject->attributes()->label = 'Different Day, Different Awesome'; 
echo $simpleXMLObject->attributes()->label; // Different Day, Different Awesome 

Sie waren nicht liegen. Es ist wirklich einfach.

0

Ich habe nicht genug Wiederholungen, um Benutzer3098738 zu kommentieren ... aber ich wollte seine Antwort bestätigen. Es ist wirklich so einfach. Jedes Mal, wenn Sie in zu @attributes in SimpleXML ... verwenden

$simpleXMLObject->attributes() 
$simpleXMLObject->key->attributes() 
0

ich mit einem HTTP-API arbeitet, die nur XML-formatierte Daten ausgeben. Also habe ich es zuerst in SimpleXML geladen und war auch verwirrt über das @attributes-Problem. Wie bekomme ich die wertvollen Daten, die es enthält? print_r() verwirrt mich.

Meine Lösung war zu ein Array erstellen und eine Iteratorvariable bei 0. Schleife durch ein SimpleXML Objekt mit foreach und steigen Sie an den Daten mit den attribues() -Methode und laden Sie es in meinen erstellen Array. Iterate vor foreach Schleife endet.

So print_r() ging dies aus zeigt:

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [ID] => 1 
      [First] => John 
      [Last] => Smith 
     ) 
) 

zu einem viel mehr verwendbar normalen Array. Das ist großartig, weil ich die Option haben wollte, das Array bei Bedarf schnell in json umzuwandeln.

Meine Lösung in Code:

$obj = simplexml_load_string($apiXmlData); 
$fugly = $obj->Deeply->Nested->XML->Data->Names; 
$people = array(); 
$i = 0; 
foreach($fugly as $val) 
{ 
    $people[$i]['id'] += $val->attributes()->ID; 
    $people[$i]['first'] = "". $val->attributes()->First; 
    $people[$i]['last'] = "". $val->attributes()->Last; 
    $i++; 
} 

Schnell note PHP settype wäre() Funktion ist seltsam/Buggy, so dass ich hinzugefügt, um die + sicher ID ist eine integer und hinzugefügt, um die zu machen zitiert, um sicherzustellen, dass der Name Zeichenfolge ist. Wenn es keine Variablenkonvertierung gibt, laden Sie SimpleXML-Objekte in das Array, das Sie erstellt haben.

Endergebnis von print_r():

Array 
(
    [0] => Array 
    (
     [id] => 1 
     [first] => John 
     [last] => Smith 
    ) 

    [1] => Array 
    (
     [id] => 2 
     [first] => Jane 
     [last] => Doe 
    ) 
) 
+0

an Diese Frage wird nicht beantwortet: Um Attribute zu lesen, müssen Sie array-ähnliche Syntax verwenden - statt 'name-> attribute' verwenden Sie' name ['attribute'] '' – Soaku