Julian
Julian

Reputation: 763

Getting attributes for XMLReader

I am having issue extracting the attributes for the following XML. I can get the attributes for the:

<Formats>
   <Format Type="6" Price="7.00" MaxDownloads="3" Status="active" ExclusiveRights="CA AU NZ ZA GB IE " NotForSale="AU NZ " />
 </Formats>

But I am struggling getting attributes for:

<Contributors>
    <Contributor Code="A01" Text="By (author)">Cairns, Warwick</Contributor>
   </Contributors>

I need both "A01" as well as the "Cairns, Warwick".

Any help is greatly appreciated.

Julian

XML below:

<?xml version="1.0"?>
    <Extract>
      <EBook EAN="9781849892100">
        <Title>About The Size Of It</Title>
        <SubTitle>A Common Sense Approach To How People Measure Things</SubTitle>
        <Publisher>General Non-Fiction</Publisher>
        <Imprint>Macmillan</Imprint>
        <PublicationDate>07/04/2011</PublicationDate>
        <Contributors>
          <Contributor Code="A01" Text="By (author)">Cairns, Warwick</Contributor>
        </Contributors>
        <BicSubjects>
          <Bic Code="PDZ">Popular science</Bic>
        </BicSubjects>
        <Formats>
          <Format Type="6" Price="7.00" MaxDownloads="3" Status="active" ExclusiveRights="CA AU NZ ZA GB IE " NotForSale="AU NZ " />
        </Formats>
        <ShortDescription>     A serious and seriously funny book about weights and measures. It explains what they are, how they come about and how they are formed and shaped by the one guiding principle of measurement that no one ever mentions: that most of us have better things to think about. This is the only book devoted to the mishmash of bodges, estimates   </ShortDescription>
        <PhysicalEditionEan>9780330450300</PhysicalEditionEan>
      </EBook>
    </Extract>

My code so far to get the required values. Attributes not pulling through :(

$z = new XMLReader;
$z->open('files/eBiblio.xml');

$doc = new DOMDocument;

# move to the first node
while ($z->read() && $z->name !== 'EBook');

# now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'EBook')
{

    $node = simplexml_import_dom($doc->importNode($z->expand(), true));

    # Get the value of each node
    $title = mysql_real_escape_string($node->Title);
    $Subtitle = mysql_real_escape_string($node->SubTitle);
    $ShortDescription = mysql_real_escape_string($node->ShortDescription);
    $Publisher = mysql_real_escape_string($node->Publisher);
    $Imprint = mysql_real_escape_string($node->Imprint);

    # Get attributes
    $isbn = $z->getAttribute('EAN');

    $contributor = $node->Contributors;
    $author = $contributor[0]->Contributor;
    $author = mysql_real_escape_string($author);

    $BicSubjects = $node->BicSubjects;
    $Bic = $BicSubjects[0]->Bic;
    $Bic = mysql_real_escape_string($Bic);


    $formats = $node->Formats;
    $type  = $formats[0]->Format;
    $price = $type[0]['Price'];
    $ExclusiveRights = $type[0]['ExclusiveRights'];
    $NotForSale = $type[0]['NotForSale'];

    # echo "<pre>".print_r($node,true)."</pre>";
    # die();

Upvotes: 0

Views: 306

Answers (2)

Sundar
Sundar

Reputation: 4650

//This may helpful for you

<?php

$cxn = mysql_connect('localhost', 'XXXX', 'XXXXXXXXX');

$xml = simplexml_load_file('graph.xml');

//print_r($xml);

//$ebook = $xml->EBook;

//get attribute
//echo($ebook->attributes()->EAN);

//get Contributors value
//echo $ebook->Contributors->Contributor;

foreach($xml->EBook as $ebook)
{

   //echo $ebook->Contributors->Contributor;

    $title = mysql_real_escape_string($ebook->Title);
    $Subtitle = mysql_real_escape_string($ebook->SubTitle);
    $ShortDescription = mysql_real_escape_string($ebook->ShortDescription);
    $Publisher = mysql_real_escape_string($ebook->Publisher);
    $Imprint = mysql_real_escape_string($ebook->Imprint);

    # Get attributes
    $isbn = $ebook->attributes()->EAN;

    $contributor = $ebook->Contributors;
    $author = $ebook->Contributors->Contributor;
    $author = mysql_real_escape_string($author);

    foreach($xml->EBook->Contributors->children() as $data)
    {

        $Code = $data->attributes()->Code;
        $Text = $data->attributes()->Code;
        /*
         print_r($data);
        die(); */
    }


    $BicSubjects = $ebook->BicSubjects;
    $Bic = $ebook->BicSubjects->Bic;
    $Bic = mysql_real_escape_string($Bic);


    $formats = $ebook->Formats;


    foreach($ebook->Formats->Format->children() as $child)
    {
        $type  = $child->attributes()->Type;
        $price = $child->attributes()->Price;
        $ExclusiveRights = $child->attributes()->ExclusiveRights;
        $NotForSale = $child->attributes()->NotForSale;
    }

}

Upvotes: 0

James Birkett
James Birkett

Reputation: 490

Have a look at SimpleXML. Specifically the link to attributes(). This should help you get started.

If you still have problems please include the php code you are useing.

EDIT:

As Sundar said simple xml is easier to use however if your xml file is large then the combination of XMLReader and simplexml will use less memory as only the current node is stored.

while ($z->name === 'EBook')
{
  $node = simplexml_import_dom($doc->importNode($z->expand(), true));
  #print EAN
  echo $node->attributes()->EAN;

  ...

  $z->next('EBook');
}

See how to use xmlreader in php

Upvotes: 1

Related Questions