• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

PHP: simplexml_load_string() erzeugt leere Objekte

Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
ich schätze mal, da bin ich jetzt einfach mal wieder zu doof.

Wenn ich einen Beispiel-XML-String ohne qualitynames in die Funktion simplexml_load_string() einlese, kriege ich schön meine Objekte. Aber lese ich sie mit dem qname "aws:" ein kriege ich nur ein leeres SimpleXMLObj...

hier der Code:
PHP:
<?php
$xmlVar = '<?xml version="1.0" encoding="utf-8" ?> 
<aws:weather xmlns:aws="http://www.aws.com/aws">
 <aws:api version="2.0" /> 
 <aws:locations>
 <aws:location cityname="Berlin" statename="" countryname="Germany" zipcode="" citycode="58439" citytype="1" /> 
 <aws:location cityname="Berlin" statename="" countryname="South Africa" zipcode="" citycode="174388" citytype="1" /> 
 <aws:location cityname="Berlin" statename="CT" countryname="United States" zipcode="06037" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="GA" countryname="United States" zipcode="31722" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="MA" countryname="United States" zipcode="01503" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="MD" countryname="United States" zipcode="21811" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="ND" countryname="United States" zipcode="58415" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="NH" countryname="United States" zipcode="03570" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="NJ" countryname="United States" zipcode="08009" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="NY" countryname="United States" zipcode="12022" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="OH" countryname="United States" zipcode="44610" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="PA" countryname="United States" zipcode="15530" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin" statename="WI" countryname="United States" zipcode="54923" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin - Ost" statename="" countryname="Germany" zipcode="" citycode="58440" citytype="1" /> 
 <aws:location cityname="Berlin - West" statename="" countryname="Germany" zipcode="" citycode="58441" citytype="1" /> 
 <aws:location cityname="Berlin-Tempelhof" statename="" countryname="Germany" zipcode="" citycode="EDDI" citytype="1" /> 
 <aws:location cityname="Berlin Center" statename="OH" countryname="United States" zipcode="44401" citycode="" citytype="0" /> 
 <aws:location cityname="Berlin Heights" statename="OH" countryname="United States" zipcode="44814" citycode="" citytype="0" /> 
 </aws:locations>
 </aws:weather>';

echo print_r(simplexml_load_string($xmlVar,1));
?>

PS: solche Dinger kommen als Antwort auf ne REST Request von nem Wetterdienst. Deshalb bin ich bei der Wahl des Strings natürlich nicht sehr flexibel ^^
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
ja, so löse ich das im moment. aber der string an sich ist w3c-xml-konform, soweit ich das einschätzen kann. Dann muss doch dieses simplexml irgendwie dazu bewegbar sein, das einzulesen. Sonst hätten doch sicher 50% und mehr der simplexml-User schon gemeckert. :(
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
ohne wirklich irgendeinen plan zu haben..... aber was macht qname? funktioniert es als qname den ganzen namespace "http://www.aws.com/aws" anzugeben? ich weiss ja nicht wie's unter php ist aber aus dem dotnet bereich kann ich mich auch erinnern, dass ohne namespace angabe auch nichts aus dem namespace sichtbar ist.
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
was paaassiert bei
Code:
echo print_r(simplexml_load_string($xmlVar,1, $ns="http://www.aws.com/aws"));
?
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
dabei kriegt man ein komisches Objekt.

Code:
SimpleXMLElement Object
(
    [api] => SimpleXMLElement Object
        (
        )

    [locations] => SimpleXMLElement Object
        (
            [location] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                        )

                    [1] => SimpleXMLElement Object
                        (
                        )

                    [2] => SimpleXMLElement Object
                        (
                        )

                    [3] => SimpleXMLElement Object
                        (
                        )

                    [4] => SimpleXMLElement Object
                        (
                        )

                    [5] => SimpleXMLElement Object
                        (
                        )

                    [6] => SimpleXMLElement Object
                        (
                        )

                    [7] => SimpleXMLElement Object
                        (
                        )

                    [8] => SimpleXMLElement Object
                        (
                        )

                    [9] => SimpleXMLElement Object
                        (
                        )

                    [10] => SimpleXMLElement Object
                        (
                        )

                    [11] => SimpleXMLElement Object
                        (
                        )

                    [12] => SimpleXMLElement Object
                        (
                        )

                    [13] => SimpleXMLElement Object
                        (
                        )

                    [14] => SimpleXMLElement Object
                        (
                        )

                    [15] => SimpleXMLElement Object
                        (
                        )

                    [16] => SimpleXMLElement Object
                        (
                        )

                    [17] => SimpleXMLElement Object
                        (
                        )

                )

        )

)


meine weiteren Recherchen lassen darauf schliessen das es Momentan keine wirklich saubere Lösung gibt um mit den Namespaces umzugehen. Deshalb haben wir uns jetzt dafür entschieden, bei der preg_replace-Variante zu bleiben. Die funktioniert weiterhin fehlerfrei. ^^
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
naja so komisch ist die objektstruktur gar nicht, was hast du denn für ein objekt erwartet? Ich bin grad nicht sicher, ob attribute als klassenvariablen zu sehen sein sollten oder nicht aber was gibt denn xmlObj->locations->location[0]->attributes() aus?

Wieauchimmer, namespaces sind ziemlich bekackt zu handeln, da geb ich dir völlig recht und ein preg_replace macht das leben um einiges einfacher :)
 
Oben