[PHP] XML attributen wijzigen lukt niet *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Ik probeer de attributen in de onderste "iets" tags aan te passen met behulp van het simpleXML object van PHP. Echter gebeurt er niets en krijg ik ook geen foutmelding. Heb tot nu toe niet kunnen achterhalen waarom de code niet werkt.

Dit is de XML code in een .xml bestand.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
<root>
     <eenTag>
          <nogEenTag>
               <iets nr="foo">
               </iets>
               <iets nr="foo">
               </iets>
               <iets nr="foo">
               </iets>
          </nogEenTag>
     </eenTag>
</root>


Dit is de PHP code:
PHP:
1
2
3
4
5
6
7
8
9
10
<?  
    $counter = 1;           

        //$xml is het PHP simpleXML object.
    foreach ($xml->root[0]->eenTag->nogEenTag->iets as $huidigeTag){
        $huidigeTag['nr'] = $counter;
        $counter++;
    }       
            
?>


PS: Weizigen --> wijzigen. (Sorry)

Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Ik gok dat je je root[0] moet veranderen naar root([$counter] (wilde gok).

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Ik heb verder nooit met dat object gewerkt maar als ik zie dat je root[0]->eenTag-> doet, krijg ik het gevoel dat je eenTag[0] moet gebruiken of dat je bij root iets fout doet (gezien de foreach denk ik het eerste, en dan is eenTag niet de enige natuurlijk).
Zet trouwens je error_reporting eens op E_ALL, dan krijg je ook notices dat eenTag een array ipv object is ofzo (gok ik).

PHP:
1
2
3
4
5
6
<?php
$bla = array();
echo "--- BEGIN 1\n1: ". $bla->bla->bla ."\n\n--- BEGIN 2\n";
error_reporting(E_ALL);
echo "2: ". $bla->bla->bla ."\n";
?>


--- BEGIN 1
1:

--- BEGIN 2

Notice: Trying to get property of non-object in - on line 5

Notice: Trying to get property of non-object in - on line 5
2:

[ Voor 35% gewijzigd door DataGhost op 30-03-2009 20:00 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En ik gok dat je de wijzigingen ook weer moet opslaan :P Anyhow; heb je iets meer relevante code? Je ziet aan het ge-gok in dit topic dat er toch nog wat handige informatie voor ons ontbreekt in je topicstart ;)

[ Voor 35% gewijzigd door RobIII op 30-03-2009 19:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
RobIII schreef op maandag 30 maart 2009 @ 19:55:
En ik gok dat je de wijzigingen ook weer moet opslaan :P Anyhow; heb je iets meer relevante code? Je ziet aan het ge-gok in dit topic dat er toch nog wat handige informatie voor ons ontbreekt in je topicstart ;)
Dat is bijna alle code. Het enige andere dat ik nog voor die code laad is:

PHP:
1
$xml = simplexml_load_file("mijnxmlbestand.xml"); //Laadt het xml bestand in het simplexml object.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

In dat geval heb je dus helemaal geen code die de boel weer wegschrijft, afdrukt of wat dan ook. Hoe weet je dan of het wel of niet werkt?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Janoz schreef op maandag 30 maart 2009 @ 20:27:
In dat geval heb je dus helemaal geen code die de boel weer wegschrijft, afdrukt of wat dan ook. Hoe weet je dan of het wel of niet werkt?
Ik dacht dat het aanpassen van de attributen in de DOM in het simpleXML object voldoende was, maar misschien zoals je aangeeft dus niet. Hoe zou ik dat dan eventueel moeten wegschrijven naar het .xml bestand mbv simpleXML?

Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Je geeft $huidigeTag niet als reference mee, de wijziging wordt dus gedaan binnen de scope van de foreach loop.


PHP:
1
2
3
4
5
6
7
    $counter = 1;            

        //$xml is het PHP simpleXML object.
    foreach ($xml->root[0]->eenTag->nogEenTag->iets as &$huidigeTag){
        $huidigeTag['nr'] = $counter;
        $counter++;
    }


of

PHP:
1
2
3
4
5
6
7
    $counter = 1;            

        //$xml is het PHP simpleXML object.
    foreach ($xml->root[0]->eenTag->nogEenTag->iets as $key => $huidigeTag){
        $xml->root[0]->eenTag->nogEenTag->iets[$key]['nr'] = $counter;
        $counter++;
    }


Zou wel moeten werken.

[ Voor 72% gewijzigd door RAJH op 30-03-2009 20:38 ]


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
RAJH schreef op maandag 30 maart 2009 @ 20:36:
Je geeft $huidigeTag niet als reference mee, de wijziging wordt dus gedaan binnen de scope van de foreach loop.


PHP:
1
2
3
4
5
6
7
    $counter = 1;            

        //$xml is het PHP simpleXML object.
    foreach ($xml->root[0]->eenTag->nogEenTag->iets as &$huidigeTag){
        $huidigeTag['nr'] = $counter;
        $counter++;
    }


of

PHP:
1
2
3
4
5
6
7
    $counter = 1;            

        //$xml is het PHP simpleXML object.
    foreach ($xml->root[0]->eenTag->nogEenTag->iets as $key => $huidigeTag){
        $xml->root[0]->eenTag->nogEenTag->iets[$key]['nr'] = $counter;
        $counter++;
    }


Zou wel moeten werken.
Heb beide oplossingen geprobeerd, maar geen van beide lijkt te werken. De eerste geeft ook een error, namelijk: Fatal error: An iterator cannot be used with foreach by reference

Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Janoz schreef op maandag 30 maart 2009 @ 20:27:
In dat geval heb je dus helemaal geen code die de boel weer wegschrijft, afdrukt of wat dan ook. Hoe weet je dan of het wel of niet werkt?
Ik vermoed dat dit idd de oorzaak is. Wanneer ik iets aanpas zoals $xml->root[0]->mijnTag = "hoi"; dan wordt "hoi" alleen in de DOM van het simpleXML object aangepast, maar niet de DOM van het .xml bestand zelf.
Ik vraag mij nu dus af hoe dit alsnog op een simpele manier te doen is.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Arcane Apex schreef op maandag 30 maart 2009 @ 21:11:
Ik vermoed dat dit idd de oorzaak is. Wanneer ik iets aanpas zoals $xml->root\[0]->mijnTag = "hoi"; dan wordt "hoi" alleen in de DOM van het simpleXML object aangepast, maar niet de DOM van het .xml bestand zelf.
Ik vraag mij nu dus af hoe dit alsnog op een simpele manier te doen is.
Wat dacht je van de boel opslaan :? (Wat ik al lang geroepen had...)
En kijk eens even in topickick binnen 24 uur :)

[ Voor 37% gewijzigd door RobIII op 30-03-2009 21:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Sorry voor de topickick, was niet bedoeld.

Het is gelukt. De volgende code past het .xml bestand ook daadwerkelijk aan. De code die ik voorheen gebruikte paste inderdaad alleen zaken in de DOM van het simpleXML object aan en niet het bestand zelf. Wanneer de DOM uit het simpleXML object naar het .xml bestand geschreven wordt werkt alles zoals bedoeld:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?    
    $counter = 1;            

        //$xml is het PHP simpleXML object.
    foreach ($xml->root[0]->eenTag->nogEenTag->iets as $huidigeTag){
        $huidigeTag['nr'] = $counter;
        $counter++;
    }        
            
$xml->asXML("mijnxmlbestand.xml");
?>

[ Voor 12% gewijzigd door Arcane Apex op 30-03-2009 21:38 ]

Pagina: 1