Avatar billede nyhuus Nybegynder
16. december 2009 - 11:11 Der er 13 kommentarer og
1 løsning

Non-Object og xml, Call to a member function item() on a non-object in

Jeg får følgene fejl når jeg prøver at lave en samlet adresse at søge på.

[code]
Notice: Trying to get property of non-object in livesearch.php on line 29

Fatal error: Call to a member function item() on a non-object in ivesearch.php on line 29
[/code]

Linie 28 og 29 er disse to:
[code]
        $theAddress = $Street->item(0)->childNodes->item(0)->nodeValue . " " . $StreetNumber->item(0)->childNodes->item(0)->nodeValue;
        if ( $Entrance == TRUE ) { $theAddress .= " " . $Entrance->item(0)->childNodes->item(0)->nodeValue; }
[/code]

Det der går galt er når den skal hente $entrance, fordi den ikke har nogen værdi, vil jeg tro.
mit xml ser ud så ledes.
[code]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AddAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <address>
        <Country>Danmark</Country>
        <County>Region Midtjylland</County>
        <Municipality>Randers</Municipality>
        <City>Randers SV</City>
        <Zip>8390</Zip>
        <Area>Der oppe nord på</Area>
        <EstateOwner>Anders And</EstateOwner>
        <Street>Andebyvej</Street>
        <StreetNumber>7913</StreetNumber>
        <Entrance> </Entrance>
        <Floor> </Floor>
    </address>
[/code]

Kan jeg på en eller anden måde lave et tjek på om deter et objekt eller ik? så jeg kan sige at det kun er hvis det er et okjekt som jeg ved x city er, så skal den tage det med?
Avatar billede repox Seniormester
16. december 2009 - 12:54 #1
Prøv lige at skrive de koder igen - mine øjne er for doven til at rende html entities igennem...
Avatar billede nyhuus Nybegynder
16. december 2009 - 13:59 #2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AddAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <address>
        <Country>Danmark</Country>
        <County>Region Midtjylland</County>
        <Municipality>Randers</Municipality>
        <City>Randers SV</City>
        <Zip>8390</Zip>
        <Area>Der oppe nord på</Area>
        <EstateOwner>Anders And</EstateOwner>
        <Street>Andebyvej</Street>
        <StreetNumber>7913</StreetNumber>
        <Entrance> </Entrance>
        <Floor> </Floor>
    </address>
Avatar billede repox Seniormester
16. december 2009 - 18:33 #3
Hvordan instancierer du XML'en i dit objekt?
Tænkte på om du ikke bare kunne fange den exception som SimpleXML smider, når det er?
Avatar billede nyhuus Nybegynder
17. december 2009 - 09:44 #4
jeg henter det ind på følgne måde:
$xmlDoc = new DOMDocument();
$xmlDoc->load("data.xml");

$x=$xmlDoc->getElementsByTagName('address');

Det er baseret på denne: http://www.w3schools.com/php/php_ajax_livesearch.asp
Avatar billede repox Seniormester
17. december 2009 - 12:44 #5
Hmm....
Ud fra den XML du har der, hvad er det så du gerne vil opnå?
Hvad skal slutresultatet blive?
Avatar billede nyhuus Nybegynder
17. december 2009 - 13:05 #6
Det jeg får ud af det her er en database jeg kan søge i, denne er så min XML fil.

Det hele virker også korrekt HVIS der står noget mellem fx <floor> og </floor>

problemet kommer med de "objekter" hvor der ikke står noget i, det er dem der fremprovokere denne fejl.

De objekter hvor der er noget i fx <city>, her virker det fint
Avatar billede repox Seniormester
17. december 2009 - 13:16 #7
Det er fordi dit XML ikke er velformateret. Så vil det ikke virke med SimpleXML.
Tomme elementer skal afsluttes korrekt.
Det vil sige at <floor></floor> skal defineres som <floor />.
Avatar billede nyhuus Nybegynder
17. december 2009 - 13:38 #8
Tjo. men er det ik muligt og tjekke om elementet er korrekt?

det synes jeg altid der er i php :) så tænkte det må der da også være med dette
Avatar billede nyhuus Nybegynder
17. december 2009 - 13:54 #9
Har prøvet at ændre xmlen så der står det du skrevet istedet for, men det giver stadig fejl



Notice: Trying to get property of non-object in livesearch.php on line 29

Notice: Trying to get property of non-object in livesearch.php on line 39


$Entrance=$x->item($i)->getElementsByTagName('Entrance');

29: if ( $Entrance == TRUE ) { $theAddress .= " " . $Entrance->item(0)->childNodes->item(0)->nodeValue; }

39: if ( $Entrance == TRUE ) { $theAddress .= " " . $Entrance->item(0)->childNodes->item(0)->nodeValue; }
Avatar billede repox Seniormester
17. december 2009 - 14:00 #10
PHP er ikke magisk ;) Det er op til dig at foretage de nødvendige kontroller og ikke forvente at PHP kan gøre det for dig.

Jeg ville bruge SimpleXML istedet og gøre således, for at kontrollere at mit XML er velformateret og ikke afbryder hele min applikation:


<?php
 
  $data = file_get_contents("data.xml");
  try
  {
    $xml = new SimpleXMLElement($data);
  }
  catch(Exception $e)
  {
    $fail = true;
  }

  if(isset($fail))
  {
    // Gør noget her, hvis der er noget galt med XML'en
  }
  else
  {
    // Gør noget her hvis XML'en er OK.
   
    // XML elementer tilgås via objekt selectoren
    echo $xml->address->Entrance;
  }




?>

Avatar billede nyhuus Nybegynder
28. december 2009 - 14:46 #11
tak for hjælpen, jeg er dog røget ind i et lidt andet problem da jeg gik fra en test fil til min fulde fil som fylder de 4 mega byte.. jeg kan ikkerigtig søge i den den går i timeout..

Jeg opretter lige et nyt spøgsmål til dette.

Smid et svar ;)
Avatar billede repox Seniormester
29. december 2009 - 18:50 #12
Du fik et svar her;
4Mb lyder dog ikke af meget - kan det tænkes at du har en dårlig PHP opsætning?
Avatar billede nyhuus Nybegynder
29. december 2009 - 19:00 #13
Det kan nemt tænkes.. lige nu tester jeg på en bærbar pc med WampServer2 std php config.
Avatar billede repox Seniormester
29. december 2009 - 19:07 #14
Well, når det kører live, så er det nemmere at teste på (jeg antager ikke dit live setup er på et windowsmiljø).
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