Avatar billede jacobs1 Nybegynder
19. september 2007 - 22:13 Der er 13 kommentarer

tilføj data til xml dokument.

Hej Eksperter.
Jeg har et problem som jeg har bøvlet med gennem længere tid.

Jeg har prøvet på at lave et phpscript der modtager 3 $_POSTvariabler og tilføjer dem til en allerede eksisterende xml fil. Men xml filen fucker op når jeg har tilføjet data til den.(The element type "user" must be terminated by the matching end-tag "</user>".)

Men det er sikkert også fuldstændig tåbeligt som jeg har lavet php’ en. Håber der er en der kan hjælpe mig på ret kurs.

Der må være en smartere måde at tilføje data til en xml fil på en min.(der så heller ikke virker :))

Resultatet skulle gerne se sådan her ud:
*********************
<?xml version="1.0" encoding="utf-8"?>
    <users>
      <user>
        <uname>
        Navn
        </uname>
        <pname>
Efternavn
        </pname>
        <email>
Email
        </email>
      </user>
    </users>
**********************

Mit script fungere således først henter den indholdet fra xml filen og sletter den sidste note "</users>" og tilføjer de nye variabler og overskiver xml filen igen.


if(isset($_POST['UserName'])){

       
    $xmlfileName = $_POST['UserName'];
    $xmlfilePass = $_POST['UserPass'];
      $xmlfileEmail = $_POST['UserEmail'];

}

$myFile = "userdatadata.xml";
$fh = fopen($myFile, 'r');
$theData = fread($fh, filesize($myFile));
fclose($fh);
$varCount=strlen($theData);
$varCount =$varCount-9;
$xml_doc = substr($theData, 0, $varCount);



        $xml_doc .=  "<user>";
       
        $xml_doc .=  "<uname>";

        $xml_doc .=  $xmlfileName;
       
        $xml_doc .=  "</uname>";
            $xml_doc .=  "<pname>";

        $xml_doc .=  $xmlfilePass;
       
        $xml_doc .=  "</pname>";

    $xml_doc .=  "<email>";

        $xml_doc .=  $xmlfileEmail;
       
        $xml_doc .=  "</email>";


        $xml_doc .=  "</user>";

        $xml_doc .=  "</users>";



$filen = "userdatadata.xml";
$someconten =  $xml_doc;


// Let's make sure the file exists and is writable first.
if (is_writable($filen)) {

        if (!$handl = fopen($filen, 'w')) {
     
        // $msg ="Cannot open file ($filename)";
      //print "par=test&msg=$msg";
        exit;
    }

    // Write $somecontent to our opened file.
    if (fwrite($handl, $someconten) === FALSE) {
 
        //  $msg ="Cannot write to file ($filename)";
      //print "par=test&msg=$msg";
        exit;
    }

   
    //$msg ="Success";
      //print "par=test&msg=$msg";

    fclose($handl);

} else {
//msg ="The file $filename is not writable";
    //  print "par=test&msg=$msg";
 
}




/**/
}
?>
Avatar billede erikjacobsen Ekspert
19. september 2007 - 22:29 #1
Bruger du PHP4 eller PHP5 ?
Avatar billede jacobs1 Nybegynder
19. september 2007 - 22:40 #2
PHP4
Avatar billede erikjacobsen Ekspert
19. september 2007 - 22:45 #3
Ok, havde du brugt PHP5 ville jeg have vist dig hvordan PHP selv håndterer XML.

Men hvorfor PHP4? Officel support ophører om et par måneder. Det er et dødt sprog.
Avatar billede jacobs1 Nybegynder
19. september 2007 - 22:48 #4
Hey jeg har et webhotel hos one.com, der køre php5 :) så jeg kan bare lægge filen derover, altså hvis du har tid.
Avatar billede olebole Juniormester
19. september 2007 - 22:52 #5
<ole>

Erik >> Hvis sproget er dødt, må man vel sige, at "Alia iacta est"  ;D

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
19. september 2007 - 23:06 #6
Ja, ja, Ole, jeg kan se du har lært Latin med umbrisk dialekt i dine unge dage.

http://n0p.com/797259.php er denne kode

<?php

$uname = "Hans";  // $_POST['UserName'];
$pname = "snaH";  // $_POST['UserPass'];
$email = "xx@xx.xx"; // $_POST['UserEmail'];


$doc = new DOMDocument('1.0');
$root = $doc->createElement('users');
$doc->appendChild($root);

$user = $doc->createElement('user');
$root->appendChild($user);

$unode = $doc->createElement('uname');
$utext = $doc->createTextNode($uname);
$unode->appendChild($utext);
$user->appendChild($unode);

$pnode = $doc->createElement('pname');
$ptext = $doc->createTextNode($pname);
$pnode->appendChild($ptext);
$user->appendChild($pnode);

$enode = $doc->createElement('email');
$etext = $doc->createTextNode($email);
$enode->appendChild($etext);
$user->appendChild($enode);


echo htmlentities($doc->saveHTML());

?>

som giver dette i browseren:

<users><user><uname>Hans</uname><pname>snaH</pname><email>xx@xx.xx</email></user></users>

som vist er hvad du ønsker. Når du skal gemme på en fil skal du i stedet for bruge:
http://dk2.php.net/manual/da/function.dom-domdocument-save.php
Avatar billede jacobs1 Nybegynder
19. september 2007 - 23:14 #7
Super - mange tak.

men hvad så hvis filen allerede indeholder:
<users><user><uname>Hans</uname><pname>snaH</pname><email>xx@xx.xx</email></user></users>

0g jeg gerne vil tilføjre mere data uden at slette det det gamle.

<users><user><uname>Hans</uname><pname>snaH</pname><email>xx@xx.xx</email></user><user><uname>Børge</uname><pname>Hephansen</pname><email>xx@xx.xx</email></user></users>
Avatar billede jacobs1 Nybegynder
19. september 2007 - 23:16 #8
<users>
  <user>
    <uname>Hans</uname>
    <pname>snaH</pname>
    <email>xx@xx.xx</email>
  </user>
    <user>
    <uname>Børge</uname>
    <pname>Svensen</pname>
    <email>xx@xx.xx</email>
  </user>
</users>
Avatar billede erikjacobsen Ekspert
19. september 2007 - 23:19 #9
Kig på den tilsvarende load-funktion. Og prøv dig frem  -  jeg kigger ind til dig i morgen, formentlig...

Og, Ole, du ved vel godt at hvis man i Rom skrev "Alia iacta est" på et stykke pergament, så kom stavekontrol-slaven forbi med den røde blyant og satte en streg under "Alia" - lige indtil man rettede det til "Alea" - så kom han med viskelæderet. Der er forskel på højromersk Latin, og så det fra Umbria. Ik' å'?  ;)
Avatar billede jacobs1 Nybegynder
20. september 2007 - 00:05 #10
Jeg kan godt sige dig mit hoved er ved at explodere....

Men jeg tror jeg har løst det. Jeg har desværre ikke haft mulighed for at teste koden i en browser, har lidt problemer med one.com/dk-hostmaster :).
Men Tjek koden, hvad siger du så :)

<?php

$uname = "Hans";  // $_POST['UserName'];
$pname = "snaH";  // $_POST['UserPass'];
$email = "xx@xx.xx"; // $_POST['UserEmail'];
$users = array();

 
 
$doc = new DOMDocument();
$doc->load( 'userdatadata.xml' );
 
$users = $doc->getElementsByTagName( "user" );
foreach( $users as $user )
{
  $unames = $user->getElementsByTagName( "uname" );
  $uname = $unames->item(0)->nodeValue;
 
  $pnames= $user->getElementsByTagName( "pname" );
  $pname= $pnames->item(0)->nodeValue;
 
  $emails = $user->getElementsByTagName( "email" );
  $email = $emails->item(0)->nodeValue;
 
  echo "<b>$name - $age - $salary\n</b><br>";
 
  $users [] = array(
  'uname' => "$uname",
  'pname' => "$pname",
  'email' => "$email"
  );
  }


 
  $users [] = array(
  'uname' => "$uname",
  'pname' => "$pname",
  'email' => "$email"
  );
 
   
 
  $doc = new DOMDocument();
  $doc->formatOutput = true;
 
  $r = $doc->createElement( "users" );
  $doc->appendChild( $r );
 
  foreach( $users as $user )
  {
  $b = $doc->createElement( "user" );
 
  $uname = $doc->createElement( "uname" );
  $uname->appendChild(
  $doc->createTextNode( $user['uname'] )
  );
  $b->appendChild( $uname );
 
  $pname = $doc->createElement( "pname" );
  $pname->appendChild(
  $doc->createTextNode( $user['pname'] )
  );
  $b->appendChild( $pname );
 
  $email = $doc->createElement( "email" );
  $email->appendChild(
  $doc->createTextNode( $user['email'] )
  );
  $b->appendChild( $email );
 
  $r->appendChild( $b );
  }
 
  echo $doc->saveXML();
  $doc->save("userdatadata.xml")
  ?>
Avatar billede arne_v Ekspert
20. september 2007 - 00:57 #11
PHP4 har faktisk også XML support.

Lidt mindre elegant og lidt mindre DOM standard'sk end i PHP5.

Men koden må sagtens kunne omskrives til PHP4.
Avatar billede olebole Juniormester
20. september 2007 - 01:46 #12
Erik >> Jeg er ked af trods alt ikke at være begavet med alderen til den slags spændende skoleoplevelser. Anyway, høj, romansk eller umbrisk ... de er kastet - der er ikke mere at spille om!  :)
Avatar billede erikjacobsen Ekspert
20. september 2007 - 08:42 #13
jacobs1: for at tilføje een knude behøver du kun læse XML-dokumentet ind, tilføje den ene knude <user> med underknuder, og skrive XML-dokumentet ud igen. Prøv igen, når du har adgang til PHP5 igen.

Arne_v: Ja, der er en slags XML understøttelse i PHP4. Men PHP4 er havnet i min sorte bog som forældet, død, finito, slut, passé, og de eneste kræfter jeg vil lægge i PHP4 er et par millisekunder om dagen, hvor jeg advarer andre mod at gå i gang med noget nyt i PHP4.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester