[PHP] Probleem met attribuut uitlezen uit XML mbv SimpleXML

Pagina: 1
Acties:
  • 221 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 27271

Topicstarter
Ik heb een xml file die ik wil parsen, hiervoor heb ik (voorlopig) SimpleXML van PHP gekozen omdat dat het meest, tja, simpel was. Dit lukt tot op zekere hoogte alleen probeer ik een attribuut van een tag uit te lezen en dat lukt me voor geen meter. Ik zit er al tijden op blind te staren zonder dat ik verder kom. Misschien kan iemand hier een blik werpen:

De xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="X_TO_Y_XML">
  <xs:complexType>
    <xs:choice>
      <xs:element name="msgtype">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="message_sequence">123</xs:element>
            <xs:element name="veld1">inhoud van veld1</xs:element>
            <xs:element name="veld2">inhoud van veld2</xs:element>
            <xs:element name="veld3">inhoud van veld3</xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
</xs:element>
</xs:schema>


Het gaat om <xs:element name="msgtype">, ik wil dus de value "msgtype" krijgen. Wat ik ook probeer, het resultaat is leeg. Momenteel heb ik (fragment):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    function PT_XML_response($xml_string) {
    // construct object from xml string
    // parse xml and return error if not valid or wellformed
        $this->xml_string = $xml_string;
        if (!$this->xml_obj = simplexml_load_string($xml_string)) {
            $this->error = "XML parse error";
        }

        $xml_children = $this->xml_obj->children("http://www.w3.org/2001/XMLSchema");

        $xml_body = $xml_children->element->complexType->choice;

        $message_type = $xml_body->element["name"];

[..]


Dit zou het volgens mij moeten zijn, maar het blijft leeg. Waar zit ik verkeerd te denken??

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09:34
WTF is je plan met die $xml_children op regel 9? Heb je enig idee wat die children()-method doet (hint)?

Verder: probeer eens te debuggen. Kijk bijvoorbeeld of je wel het juiste element gevonden hebt, en zo niet, of je wel de juiste parent gevonden hebt, en zo terug tot je de plek vind waar het misgaat. Een lap code schrijven en dan constateren dat die niet werkt is geen debuggen en totdat je daar zelf mee bezig bent geweest hoor je geen topic op GoT te plaatsen.

[ Voor 59% gewijzigd door Soultaker op 19-04-2006 19:57 ]


Acties:
  • 0 Henk 'm!

Anoniem: 27271

Topicstarter
Soultaker schreef op woensdag 19 april 2006 @ 19:55:
WTF is je plan met die $xml_children op regel 9? Heb je enig idee wat die children()-method doet (hint)?
Dat is het probleem niet. Ik weet wat children() doet en ik gebruik die functie correct. Ik heb die functie nodig ivm de namespaces die in de xml zitten. HINT
Verder: probeer eens te debuggen. Kijk bijvoorbeeld of je wel het juiste element gevonden hebt, en zo niet, of je wel de juiste parent gevonden hebt, en zo terug tot je de plek vind waar het misgaat. Een lap code schrijven en dan constateren dat die niet werkt is geen debuggen en totdat je daar zelf mee bezig bent geweest hoor je geen topic op GoT te plaatsen.
Wat denk je dat ik vandaag heb zitten doen? Ik ben er de hele dag mee bezig geweest en heb me suf gedebugd. Het is niet een simpel "lees de handleiding" probleem want ik heb elke handleiding doorgelezen die ik kon vinden. En als ik er echt niet meer uitkom dan plaats ik het hier, en dat doe ik niet snel. Misschien kun jij even kijken en constateren dat mijn code volgens de theorie zou moeten werken (doe eens een print_r van $xml_body bijvoorbeeld), in plaats van meteen maar allerlei aannames te gaan doen?

Acties:
  • 0 Henk 'm!

  • WvdWest
  • Registratie: Augustus 2002
  • Niet online
Volgens je eigen link lijkt me dat het volgende meer in de buurt komt:
PHP:
1
$message_type = $xml_body->element->getAttribute('name');

I'm not a complete idiot - several parts are missing.


Acties:
  • 0 Henk 'm!

Anoniem: 27271

Topicstarter
WvdWest schreef op woensdag 19 april 2006 @ 20:31:
Volgens je eigen link lijkt me dat het volgende meer in de buurt komt:
PHP:
1
$message_type = $xml_body->element->getAttribute('name');
Dat is DOM ;) En dat werkt niet op een SimpleXML object...

Maar ik zit er inderdaad aan te denken om DOM of evt expat te gebruiken ipv SimpleXML.

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 09-06 06:07

JHS

Splitting the thaum.

Persoonlijk denk ik dat je een stuk beter over kan stoppen op de DOM Functions, aangezien die een stuk uitgebreider zijn, en daarnaast echt niet ingewikkeld. Iniedergeval vind ik het persoonlijk erg prettig werken :) .

DM!


Acties:
  • 0 Henk 'm!

  • WvdWest
  • Registratie: Augustus 2002
  • Niet online
Anoniem: 27271 schreef op woensdag 19 april 2006 @ 21:52:
[...]


Dat is DOM ;) En dat werkt niet op een SimpleXML object...

Maar ik zit er inderdaad aan te denken om DOM of evt expat te gebruiken ipv SimpleXML.
Ok, duidelijk te snel gelezen.

I'm not a complete idiot - several parts are missing.


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 30-05 22:08
de children()-method geeft een pseudo-array volgens de docs dus
PHP:
1
$xml_children->element->complexType->choice;

is idd. leeg. deze :
PHP:
1
$xml_children[0]->element->complexType->choice;

is wel gevuld. het probleem blijft echter hetzelfde (getest hier). helemaal begrijpen doe ik 't niet (ik gebruik altijd DOM, en bijna nooit namespaces), maar het lijkt er op dat dit

PHP:
1
2
3
$xml_children = $this->xml_obj->children("http://www.w3.org/2001/XMLSchema");
$xml_body = $xml_children[0]->element->complexType->choice;
$message_type = $xml_body->element["name"];

uiteindelijk zoekt naar het attribute 'name' in de in de eerste regel gegeven namespace. dat attribuut zit echter in de global namespace, gezien de uitvoer van :
PHP:
1
2
$att = $xml_body->element->attributes();
foreach($att as $k=>$v) print $k."=".$v."\n";

dat gewoon :
code:
1
name=msgtype

geeft....

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09:34
Anoniem: 27271 schreef op woensdag 19 april 2006 @ 20:14:
Dat is het probleem niet. Ik weet wat children() doet en ik gebruik die functie correct. Ik heb die functie nodig ivm de namespaces die in de xml zitten. HINT
Ik weet niet wat je met de link wil bewijzen, maar je selecteert dus alleen de children in de XMLSchema namespace, waar die name dus helemaal niet in zit. De reden dat ik daar een opmerking over maakte was dat ik niet begrijp waarom je children() wil gebruiken als je er ook best direct bij kan.

De reden dat ik je verwijt slecht te debuggen is dat ik helemaal niet zie staan waar het nu precies misgaat. Je zegt alleen dat je code 'niets print'. Tja, dat is niet zo interessant. Je zou op z'n de verschillende nodes in hun geheel kunnen printen om te zien wáár die attribute nu precies verdwijnt.

Volgens mij (maar ik heb nog nooit met SimpleXML gewerkt, of je code getest) moet je die hele regel er dus uitgooien; dan kun je gewoon de elementen vinden door de volledige attribuutnamen (inclusief namespaces) te gebruiken.
Pagina: 1