[php/xml] xml node verwijderen uit file

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
Ola,

een topicje terug had ik het gesteld maar die is gesloten (oke stomme fout van mij ) maar daat lag het niet aan......

resume :)

Ik heb een adresboek in xml. Deze lees ik, en ik kan adressen toevoegen via DOMXML. Werkt geweldig, alleen wat ook makkelijk is om iets te kunnen verwijderen.
Helaas wordt er niet veel gerept in de docs op php.net en verandert het wel eens, misschien dat iemand het dus wel voor elkaar heeft gekregen.

Ik heb het volgende voor deleten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if($_POST['delete']) {
    $userId = $_SESSION['userId'];
    $nodeId = $_POST['name'];
    echo $nodeId;
    
    $doc = openXml(2);
    $root = $doc->document_element();

    $removeNode = $doc->get_elements_by_tagname($nodeId);
    for($x=0; $x<sizeof($removeNode); $x++) {
        echo $
        $unlinked = $removeNode->unlink_node($removeNode[$x]) or die("oeps");
    }
    if($unlinked) {
        echo "deleted";
    }else{
        echo "failed";
    }
}

Maar ik krijg telkens "failed" terug.
Gebruik van unlink_node(), dump_node() maakt niets uit :(

[edit]
einde van r12 was een testje wat niks uitmaakt

[ Voor 9% gewijzigd door TheRebell op 14-02-2003 14:10 ]


Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Je zou de xml file kunnen openen met fopen, dan met ereg_replace() de node eruit halen (replacen met leeg) en 'm dan terug opslaan...

PHP:
1
2
3
4
5
6
<?
$fp = fopen("adresboek.xml", w+);
$fpp = fread($fp, filesize($fp));
$nieuw_content = ereg_replace("<invoer id=\"". $id_die_verwijderd_moet_worden ."\">([^\\\[]*)</invoer>", "", $fpp);
fwrite($nieuw_content, $fp);
?>


Ik ben nu niet 100% zeker of er geen bugje/foutje inzit, maar dat is het principe voor mijn oplossing :)

[ Voor 12% gewijzigd door dingstje op 14-02-2003 14:28 ]

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
hmmm, is idd een manier ja. Ik zal es kijken of dit kan :)

maar in proncipe moet dit ook via DOMXML kunnen en zo zou ik het ook het liefst willen

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
dingstje: Je zou de xml file kunnen openen met fopen, dan met ereg_replace() de node eruit halen
Zou je niet zulke onfatsoenlijk voorstellen willen doen? ;) . Dit is dus typisch een oplossing die erg fout is.

XML als tekst behandelen is namelijk nogal een zwakke manier van werken.

Allereerst kunnen er veel constructies in het document zitten die jouw tekst georienteerde methode niet laten functioneren, terwijl ze toch de informatie niet beinvloeden. Denk dan bijvoorbeel aan entiteiten, namespace declaraties, volgorde van attributen enz.

Ten tweede is er in een tekst georienteerde methode een stuk minder garantie dat je output well-formed XML is. Wie zegt dat je tekst manipulaties geen ongeldige XML opleveren?

Ten derde is er de mogelijkheid dat de leverancier niet well-formed XML aanlevert. Je tool zal dit in het meest positieve geval accepteren en juist functioneren (wat onjuist is), maar wellicht zal het min of meer werken, maar bugs veroorzaken (wat nog ernstiger is).

Er zijn zeker nog veel meer nadelen te verzinnen ;) .

Je moet dus inderdaad gewoon via de DOM werken. Nu ken ik de PHP DOM library niet echt omdat ik over het algemeen niet in PHP werk, maar naar mijn idee zou je de functie remove_child moeten hebben:

http://www.php.net/manual....domnode-remove-child.php

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment