| 

.NET C# Java Javascript Exception

2
ich habe folgende xml struktur:

<stores>
<store>
<name></name>
<address></address>
<custom-attributes>
<custom-attribute attribute-id="country">Deutschland</custom-attribute>
<custom-attribute attribute-id="displayWeb">false</custom-attribute>
</custom-attributes>
</store>
</stores>


wie kann ich nun zb. den wert von "displayWeb" auslesen?

bisher habe ich folgenden code
<?php
$data = file_get_contents('URL von xml');
$data = simplexml_load_string($data);
foreach ($data->store as $store) {
foreach ($store->custom-attributes as $att){
echo $att->attribute_id['displayWeb'];
}
}
?>


leider funktioniert es bisher so leider nicht, da ich ich eine fehlermeldung bei der zweiten foreach schleife bekommen
06.02.2012
burner007 810 1 2 9
3 Antworten
2
simplexml_load_string parst die attribute von den values nich sondern stopft nur die elementnamen in einen object / array mix. Besser ist, du benutzt die ->children() Methode auf SimpleXmlObject-Elemente. Schau mal, das hier ist die Struktur von deinem Objekt

echo '<pre>';
print_r(simplexml_load_string($data));

// Ausgabe
SimpleXMLElement Object
(
[store] => SimpleXMLElement Object
(
[name] => SimpleXMLElement Object
(
)

[address] => SimpleXMLElement Object
(
)

[custom-attributes] => SimpleXMLElement Object
(
[custom-attribute] => Array
(
[0] => Deutschland
[1] => false
)
)
)
)


Wie du siehst, werden die Attribute nicht umgesetzt. PHP hat probleme damit, den Bindestrich ( custom-attributes) richtig um zu setzen. Hier ein funktionierendes Codebeispiel:

<?php
$data = '<stores>
<store>
<name>Peter</name>
<address>Pan</address>
<customattributes>
<customattribute attributeid="country">Deutschland</customattribute>
<customattribute attributeid="displayWeb">false</customattribute>
</customattributes>
</store>
</stores>';
echo '<pre>';

$data = (simplexml_load_string($data));

foreach ($data->store as $person) {
// ->children() gets all child elements of node <customattributes>
foreach ($person->customattributes->children() as $customAttribute) {
// ->attributes() gets all attributes of current node as object
echo $customAttribute->attributes()->attributeid.' : ' . $customAttribute. '<br />';
}
}

?>


Anmerkung: Ich habe die Bindestriche entfernt weil mir PHP bei folgender Zeile Fehler geschmissen hat: "$person->custom-attributes->children()"

Update: So klappt es mit den Bindestrichen:
foreach ($data->store as $person) {
// ->children() gets all child elements of node <customattributes>
foreach ($person->{'custom-attributes'}->children() as $customAttribute) {
// ->attributes() gets all attributes of current node as object
echo $customAttribute->attributes()->attributeid.' : ' . $customAttribute. '<br />';
}
}

Ausgabe:
country : Deutschland
displayWeb : false


Update 2: Um via xpath alle 'custom-attribute' Elemente zu erhalten die als attributeid den Wert 'displayWeb' haben, kannst du folgenden Code verwenden:
$element = $data->xpath("//custom-attribute[@attributeid='displayWeb']");
echo $element[0];
// das nächste element wäre dann [1], wenn es mehrere gibt ...


Ausgabe: false

Weitere Informationen zu Simple-XML findest du übriegens hier: Simple-XML
Weitere Informationen zum Syntax von XPath findest du zum Beispiel hier: XPath Syntax

Beste Grüße

PS: Ein wenig mehr Eigeninitiative beim Lösen deiner Probleme würden dir helfen schneller ein besserer Entwickler zu werden - Nicht böse gemeint, nur ein gut gemeinter Ratschlag.
07.02.2012
Nicolai Schönberg 2,4k 2 9
Danke für die ausführliche Beschreibung! Leider kann ich die XML Daten nicht ändern, der Bindestrich bleibt also.

Kennst du denn auch einen Weg das Problem zu lösen mit dem Bindestrich?
burner007 07.02.2012
Jo - Hab ich. Grade rausgefudnen ;) Siehe update der Antwort. Gruß
Nicolai Schönberg 07.02.2012
-1
und wie kann ich nur den wert von "displayWeb" abzufragen?
07.02.2012
burner007 810 1 2 9
burner007 810 1 2 9
Wie meinst du das?
Nicolai Schönberg 07.02.2012
im aktuellen code werden alle werte von den "custom-attributes" ausgegeben. ich möchte aber ganz speziel den wert "false", in diesem fall, vom attribute "displayWeb" ausgeben lassen.
burner007 07.02.2012
Entweder If Abfrage oder xpath
Nicolai Schönberg 07.02.2012
-1
ich habs nun so versucht! bekomme aber keine ausgabe

$data = (simplexml_load_string($xml));
foreach ($data->store as $store) {
echo $store->xpath(store/custom-attributes/custom-attribute[@attribute-id='displayWeb']);
}
07.02.2012
burner007 810 1 2 9
Ja kein Wunder... weil es totaler quatsch ist wie du den Syntax benutzt :( Ich update meine Antwort oben. Bitte benutzte das nächste mal öfter die Edit Funktion um Nachträge deiner Antwort hinzuzufügen anstatt immer wieder neue Beiträge zu verfassen.
Nicolai Schönberg 07.02.2012

Stelle deine Php-Frage jetzt!