Avatar billede michaelgm Nybegynder
10. oktober 2007 - 08:32 Der er 11 kommentarer og
1 løsning

læse xml og attributer

Nu har jeg siddet hele natten og prøvet mig frem. Kan simpelthen ikke få det til at virke..

Her er min kode:

$xmlFile = "film2.xml";
echo "<table border=\"1\">";
class RSSParser
{

    var $insideitem = false;
    var $title = "";
    var $genre = "";
    var $id = "";
    var $sprog = "";
    var $collectionnr = "";
    var $countryoforigin = "";
    var $productionyear = "";
    var $released = "";
    var $runningtime = "";
    var $region = "";
    var $studio = "";
    var $audioformat = "";
    var $subtitle = "";
    var $overview = "";
    var $lastedited = "";
    var $actors = "";
   
    function startElement($parser, $tagName, $attrs)
    {
        if ($this->insideitem)
        {
            $this->tag = $tagName;
        }
        elseif ($tagName == "DVD")
        {
            $this->insideitem = true;
        }
    }
   
    function unhtmlspecialchars( $string )
    {
        $string = str_replace ( '&amp;', '&', $string );
        $string = str_replace ( '&#039;', '\'', $string );
        $string = str_replace ( '&quot;', '\"', $string );
        $string = str_replace ( '&lt;', '<', $string );
        $string = str_replace ( '&gt;', '>', $string );
       
        return $string;
    }
   
    function endElement($parser, $tagName)
    {
        if ($tagName == "EVENTS")
        {
            $billedeurl = substr(trim($this->id), 0, 2);
            echo "<tr>";
            echo "<td width=\"100\"> <img src=\"http://www.invelos.com/mpimages/" . $billedeurl . "/" . trim($this->id) . "f.jpg\">&nbsp;</td>";
            echo "<td width=\"300\">" . trim($this->title) . "&nbsp;</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->genre) . "</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->sprog) . "</td>";
           
            echo "<td width=\"250\">&nbsp;" . trim($this->collectionnr) . "</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->countryoforigin) . "</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->productionyear) . "</td>";
            //echo "<td width=\"250\">&nbsp;" . trim($this->released) . "</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->runningtime) . "</td>";
            //echo "<td width=\"250\">&nbsp;" . trim($this->region) . "</td>";
            //echo "<td width=\"250\">&nbsp;" . trim($this->studio) . "</td>";
            //echo "<td width=\"250\">&nbsp;" . trim($this->audioformat) . "</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->subtitle) . "</td>";
            //echo "<td width=\"250\">&nbsp;" . trim($this->overview) . "</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->lastedited) . "</td>";
            echo "<td width=\"250\">&nbsp;" . trim($this->actors) . "</td>";
            echo "</tr>";
            //Osv....

            $this->title = "";           
            $this->genre = "";
            $this->id = "";
            $this->sprog = "";
            $this->collectionnr = "";
            $this->countryoforigin = "";
            $this->productionyear = "";
            $this->released = "";
            $this->runningtime = "";
            $this->region = "";
            $this->studio = "";
            $this->audioformat = "";
            $this->subtitle = "";
            $this->overview = "";
            $this->lastedited = "";
            $this->actors = "";
            $this->insideitem = false;
        }
    }
   
    function characterData($parser, $data)
    {
        if ($this->insideitem)
        {
            switch ($this->tag)
            {
                case "TITLE":
                    $this->title .= $data;
                    break;
                case "GENRE":
                    $this->genre .= $data;
                    break;
                case "ID":
                    $this->id .= $data;
                    break;
                case "AUDIOCONTENT":
                    $this->sprog .= $data;
                    break;
                case "COLLECTIONNUMBER":
                    $this->collectionnr .= $data;
                    break;
                case "COUNTRYOFORIGIN":
                    $this->countryoforigin .= $data;
                    break;
                case "PRODUCTIONYEAR":
                    $this->productionyear .= $data;
                    break;
                case "RELEASED":
                    $this->released .= $data;
                    break;
                case "RUNNINGTIME":
                    $this->runningtime .= $data;
                    break;
                case "REGION":
                    $this->region .= $data;
                    break;
                case "STUDIO":
                    $this->studio .= $data;
                    break;
                case "AUDIOFORMAT":
                    $this->audioformat .= $data;
                    break;                   
                case "SUBTITLE":
                    $this->subtitle .= $data;
                    break;
                case "OVERVIEW":
                    $this->overview .= $data;
                    break;
                case "LASTEDITED":
                    $this->lastedited .= $data;
                    break;
                case "ACTORS":
                    $this->actors .= $data;
                    break;
       
       
            }
        }
    }
}


$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser,XML_OPTION_TARGET_ENCODING,'ISO-8859-1');
$rss_parser = new RSSParser();
xml_set_object($xml_parser,&$rss_parser);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$fp = fopen($xmlFile,"r") or die("Error reading XML data.");
while ($data = fread($fp, 4096))
{
    xml_parse($xml_parser, $data, feof($fp))
        or die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($xml_parser)),
        xml_get_current_line_number($xml_parser)));
}
fclose($fp);
xml_parser_free($xml_parser);

echo "</table>";


Mit spørgsmål er så hvordan jeg læser en attribut der ikke ligger i elementet DVD.

her kommer den xml jeg henter fra. Det er så ACTOR jeg gerne vil kunne hente fra.

- <DVD>
  <ProfileTimestamp>2007-09-10T19:19:13.000Z</ProfileTimestamp>
  <ID>5706102329531.14</ID>
- <MediaTypes>
  <DVD>True</DVD>
  <HDDVD>False</HDDVD>
  <BluRay>False</BluRay>
  </MediaTypes>
  <UPC>5-706102-329531</UPC>
  <CollectionNumber>1</CollectionNumber>
  <CollectionType>Owned</CollectionType>
  <Title>Flådens Friske Fyre</Title>
  <DistTrait />
  <OriginalTitle />
  <CountryOfOrigin>Denmark</CountryOfOrigin>
  <ProductionYear>1965</ProductionYear>
  <Released>2004-10-18</Released>
  <RunningTime>98</RunningTime>
  <Rating>A</Rating>
  <CaseType>Keep Case</CaseType>
- <Genres>
  <Genre>Comedy</Genre>
  </Genres>
- <Regions>
  <Region>2</Region>
  </Regions>
- <Format>
  <FormatAspectRatio>1.66</FormatAspectRatio>
  <FormatVideoStandard>PAL</FormatVideoStandard>
  <FormatLetterBox>True</FormatLetterBox>
  <FormatPanAndScan>False</FormatPanAndScan>
  <FormatFullFrame>False</FormatFullFrame>
  <Format16X9>False</Format16X9>
  <FormatDualSided>False</FormatDualSided>
  <FormatDualLayered>True</FormatDualLayered>
  </Format>
- <Features>
  <FeatureSceneAccess>True</FeatureSceneAccess>
  <FeatureCommentary>False</FeatureCommentary>
  <FeatureTrailer>True</FeatureTrailer>
  <FeaturePhotoGallery>True</FeaturePhotoGallery>
  <FeatureDeletedScenes>False</FeatureDeletedScenes>
  <FeatureMakingOf>False</FeatureMakingOf>
  <FeatureProductionNotes>True</FeatureProductionNotes>
  <FeatureGame>False</FeatureGame>
  <FeatureDVDROMContent>False</FeatureDVDROMContent>
  <FeatureMultiAngle>False</FeatureMultiAngle>
  <FeatureMusicVideos>False</FeatureMusicVideos>
  <FeatureInterviews>False</FeatureInterviews>
  <FeatureStoryboardComparisons>False</FeatureStoryboardComparisons>
  <FeatureOuttakes>False</FeatureOuttakes>
  <FeatureClosedCaptioned>False</FeatureClosedCaptioned>
  <FeatureTHXCertified>False</FeatureTHXCertified>
  <OtherFeatures>Bioprogram, Sangperler</OtherFeatures>
  </Features>
- <Studios>
  <Studio>Merry Film</Studio>
  <Studio>Scanbox Entertainment</Studio>
  </Studios>
- <Audio>
- <AudioTrack>
  <AudioContent>Danish</AudioContent>
  <AudioFormat>Dolby Digital Mono</AudioFormat>
  </AudioTrack>
  </Audio>
- <BoxSet>
  <Parent />
  <Contents />
  </BoxSet>
- <Subtitles>
  <Subtitle>Danish</Subtitle>
  <Subtitle>Norwegian</Subtitle>
  <Subtitle>Swedish</Subtitle>
  </Subtitles>
  <SRP DenominationType="DKK" DenominationDesc="Denmark (Krone)" FormattedValue="kr149,95">149.95</SRP>
- <Actors>
  <Actor FirstName="Dirch" MiddleName="" LastName="Passer" BirthYear="0" Role="Valdemar Jensen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Ghita" MiddleName="" LastName="Nørby" BirthYear="0" Role="Hanne Hansen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Ove" MiddleName="" LastName="Sprogøe" BirthYear="0" Role="Knud Hansen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Paul" MiddleName="" LastName="Hagen" BirthYear="0" Role="Svend Nielsen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Hans" MiddleName="W." LastName="Petersen" BirthYear="0" Role="Peter Hansen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Carl" MiddleName="" LastName="Ottosen" BirthYear="0" Role="Kompagnichef" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Kai" MiddleName="" LastName="Holm" BirthYear="0" Role="Fiskeeksportør" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Jan" MiddleName="" LastName="Priiskorn-Schmidt" BirthYear="0" Role="Jan Hansen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Karl" MiddleName="" LastName="Stegger" BirthYear="0" Role="Bådsmanden" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Preben" MiddleName="" LastName="Mahrt" BirthYear="0" Role="Chefen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Sigrid" MiddleName="" LastName="Horne-Rasmussen" BirthYear="0" Role="Frk. Mortensen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Bent" MiddleName="" LastName="Vejlby" BirthYear="0" Role="Befalingsmand" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Katja" MiddleName="" LastName="Miehe-Renard" BirthYear="0" Role="Lise" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Axel" MiddleName="" LastName="Strøbye" BirthYear="0" Role="Telegrafist" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Gyda" MiddleName="" LastName="Hansen" BirthYear="0" Role="Karen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Hugo" MiddleName="" LastName="Herrestrup" BirthYear="0" Role="Anton Nicholaisen" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Jesper" MiddleName="" LastName="Langberg" BirthYear="0" Role="Kok" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Svend" MiddleName="" LastName="Bille" BirthYear="0" Role="Karlsen - overtjener på færge" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Bjørn" MiddleName="" LastName="Spiro" BirthYear="0" Role="Kaptajn på færge" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Holger" MiddleName="" LastName="Vistisen" BirthYear="0" Role="Styrmand på færge" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Kirsten" MiddleName="" LastName="Passer" BirthYear="0" Role="Svends venindes søster" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Valsø" MiddleName="" LastName="Holm" BirthYear="0" Role="Billardspiller" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Arthur" MiddleName="" LastName="Jensen" BirthYear="0" Role="Bankdirektør" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Christine" MiddleName="" LastName="Broe" BirthYear="0" Role="Jans pige" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Bent" MiddleName="" LastName="Werther" BirthYear="0" Role="Kok" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Basse" MiddleName="" LastName="Lorentzen" BirthYear="0" Role="Bornholmeren" CreditedAs="" Voice="False" Uncredited="False" />
  <Actor FirstName="Viggo" MiddleName="" LastName="Hansen" BirthYear="0" Role="Mariner" CreditedAs="" Voice="False" Uncredited="False" />
  </Actors>
- <Credits>
  <Credit FirstName="Finn" MiddleName="" LastName="Henriksen" BirthYear="0" CreditType="Direction" CreditSubtype="Director" CreditedAs="" />
  <Credit FirstName="Carl" MiddleName="" LastName="Ottosen" BirthYear="0" CreditType="Writing" CreditSubtype="Screenwriter" CreditedAs="" />
  <Credit FirstName="Dirch" MiddleName="" LastName="Passer" BirthYear="0" CreditType="Production" CreditSubtype="Producer" CreditedAs="" />
  <Credit FirstName="Henrik" MiddleName="" LastName="Sandberg" BirthYear="0" CreditType="Production" CreditSubtype="Producer" CreditedAs="" />
  <Credit FirstName="Henning" MiddleName="" LastName="Bendtsen" BirthYear="0" CreditType="Cinematography" CreditSubtype="Cinematographer" CreditedAs="" />
  <Credit FirstName="Maj" MiddleName="" LastName="Soya" BirthYear="0" CreditType="Film Editing" CreditSubtype="Film Editor" CreditedAs="" />
  <Credit FirstName="Svend" MiddleName="" LastName="Asmussen" BirthYear="0" CreditType="Music" CreditSubtype="Composer" CreditedAs="" />
  <Credit FirstName="Jon" MiddleName="" LastName="Branner" BirthYear="0" CreditType="Sound" CreditSubtype="Sound Editor" CreditedAs="" />
  <Credit FirstName="Erik" MiddleName="" LastName="Aaes" BirthYear="0" CreditType="Art" CreditSubtype="Production Designer" CreditedAs="" />
  </Credits>
  <Overview>Tre unge fiskere - Svend, Knud og Valdemar - har købt sig en kutter. Kort efter bliver de alle tre indkaldt til Marinen for at aftjene deres værnepligt på det gode skib Triton. Med de tre venner ombord sejler Triton de danske farvande tyndt. Men banken forlanger penge. Kutteren skal betales. Gode råd er dyre og et forrygende kapløb med tiden begynder... Saltvand, skumsprøjt, højt humør, et hav af friske marinere og en pige i hver en havn. Hvad mere kan man forlange?</Overview>
- <Discs>
- <Disc>
  <DescriptionSideA>Main Feature</DescriptionSideA>
  <DescriptionSideB />
  <DiscIDSideA>620837C6AD9C7725</DiscIDSideA>
  <DiscIDSideB />
  <LabelSideA>DVDVolume</LabelSideA>
  <LabelSideB />
  <DualLayeredSideA>True</DualLayeredSideA>
  <DualLayeredSideB>False</DualLayeredSideB>
  <DualSided>False</DualSided>
  <Location />
  <Slot />
  </Disc>
  </Discs>
  <SortTitle>Flådens Friske Fyre</SortTitle>
  <LastEdited>2007-10-09T06:08:12.000Z</LastEdited>
  <WishPriority>0</WishPriority>
- <PurchaseInfo>
  <PurchasePrice DenominationType="USD" DenominationDesc="United States (Dollar)" FormattedValue="$0,00">0</PurchasePrice>
  <PurchasePlace />
  <PurchasePlaceType />
  <PurchasePlaceWebsite />
  <PurchaseDate>2007-10-09</PurchaseDate>
  </PurchaseInfo>
  <Review Film="0" Video="0" Audio="0" Extras="0" />
  <Events />
- <LoanInfo>
  <Loaned>False</Loaned>
  </LoanInfo>
  </DVD>
Avatar billede erikjacobsen Ekspert
10. oktober 2007 - 09:19 #1
Du bruger ikke PHP5?
Avatar billede michaelgm Nybegynder
10. oktober 2007 - 17:19 #2
Jo det gør jeg.
Undskyld jeg svare så sent. Men man bliver træt efter sådan en nat.
Avatar billede michaelgm Nybegynder
10. oktober 2007 - 20:35 #3
Er gået over til simplexml efter du spurgte om jeg ikke brugte php5
Så hvis du kan give et eksempel på hvordan jeg hiver

<Actors>
  <Actor FirstName="Dirch" MiddleName="" LastName="Passer" BirthYear="0" Role="Valdemar Jensen" CreditedAs="" Voice="False" Uncredited="False" />
</Actors>

ud fra min xml får du selvfølgelig dine points
Avatar billede erikjacobsen Ekspert
10. oktober 2007 - 20:46 #4
Det er nu DOM metoderne jeg synes er til at have med at gøre. Utestet, men klippet og ændret ud fra noget kode jeg har liggende:

    $dom = new DOMDocument();
    $dom->load("film.xml");

    $actor_nodelist = $dom->getElementsByTagName('Actor');
    for ($i=0;$i<$actor_nodelist->length;$i++) {
      $actor_node = $actor_nodelist->item($i);
      //...
    }
Avatar billede michaelgm Nybegynder
10. oktober 2007 - 21:40 #5
Kan sagtens se hvad du mener.. Synes bare det jeg har set med DOM har det virket uoverskuligt. Kan være jeg skulle studere det lidt mere.

Men det er vel i princippet det samme jeg gør her med simplexml:

if (file_exists('film2.xml')) {

    $xml = simplexml_load_file('film2.xml');
    //$xml = utf8_decode($xml); forsøg på encoding
    //print_r($xml);
   
    foreach ($xml->DVD as $film)
    {
        echo utf8_decode($film->Title). " ";
        echo $film->ProductionYear. " ";
        echo "<br>";
       
        foreach ($xml->xpath("//Actors/Actor") as $skuespiller) {
            echo "<font size=\"2\" color=\"gray\" face=\"tahoma\">".utf8_decode($skuespiller[FirstName])." ". utf8_decode($skuespiller[LastName]) ."</font><br>";
        }
        echo "<br>";
    }       
   
} else {
    exit('Failed to open film2.xml.')


Problemet er bare den tager alle skuespillere og ikke kun for den pågælende film
Avatar billede erikjacobsen Ekspert
10. oktober 2007 - 21:52 #6
Er der ikke kun een DVD i XML-filen?  Du kan formentlig finde den præcise film med et XPath-udtryk. Jeg har ingen personlig erfaring med simplexml.
Avatar billede michaelgm Nybegynder
10. oktober 2007 - 22:01 #7
Jo lige i den jeg viste her i den rigtige er der rigtig mange.. Skulle jeg vise flere her ville det blive et alt for langt spørgsmål. Det var bare for man kunne se strukturen på min xml.. Jeg må prøve og søge videre.

Har du nogen gode sider til at komme igang med DOM?
Avatar billede erikjacobsen Ekspert
10. oktober 2007 - 22:03 #8
Nej, jeg ved ikke lige hvad der vil være "gode sider" for dig. Google vil gerne være din ven ;) 

Hvordan identificerer du din DVD - vi kan vel finde ud af hvad du skal skrive i dit XPath-udtryk.
Avatar billede michaelgm Nybegynder
10. oktober 2007 - 22:13 #9
hver DVD har en unik ID
feks: <ID>5706102329531.14</ID>
Avatar billede michaelgm Nybegynder
10. oktober 2007 - 22:40 #10
Jeg har fundet ud af det.. Ellers tak for hjælpen.

Løsning:
$xml->xpath("//DVD[ID=\"".$film->ID."\"]/Actors/Actor"
Avatar billede michaelgm Nybegynder
11. oktober 2007 - 01:39 #11
svar
Avatar billede erikjacobsen Ekspert
11. oktober 2007 - 08:39 #12
Det er nemlig rigtigt!
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