0

Ok, so I thought I had this nailed , but sadly not . I have this XML:

//XML
this is root--> <story> 
<article>
<title>my title </title>
<img>my image </img>
<link>my link </link
</article>
</story>

and then this PHP:

//php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXML($_SESSION['xml']);
$xpath = new DOMXPath($dom);
$query = $xpath->query('//section/article');

foreach($query as $article  ):
                $currentTitle = $article->title ;
//edit - mistake in code - $article used for all 
                //$imagearray =  $currentimg->img ;
                //$linkarray =  $currentlink->link ;
                array_push( $availAds,$currentTitle,$imagearray,$linkarray );
        endforeach;

So what I'm trying to do is get the 'Title' 'Img' and 'Link' values and insert them into a pre existing array. The array already outputs fine with the previously entered values, but I then need to be able to output the results of the updated array in this way:

    printf(
                    '<input name="ads[%1$s][title]" value="%2$s" style="width:310px;" /><br />',
                    $availAd['image'],
                    $availAd['title']
                );

The issue is right now , the foreach returns NULL for $currentTitle , $imagearray and $linkarray

11
  • And what is the problem exactly? Sorry, I must not have read your question well enough. Commented Mar 24, 2011 at 15:20
  • @BobFlemming: Retagging to xpathengines because this refers to data type of specific XPath engine's result. Commented Mar 24, 2011 at 15:25
  • the issue is that $currentimg->img etc. doesnt work. It comes up as NULL for every value in the Foreach Commented Mar 24, 2011 at 15:29
  • @BobFlemming: Where is $currentimg set? Commented Mar 24, 2011 at 15:31
  • sorry, that was a mistake. All of those are "$article" not $currentimg or $currentlink Commented Mar 24, 2011 at 15:36

2 Answers 2

2

As Gordon said: you need simplexml instead of domdocument/domxpath if you want to access child elements like $parent->childelements.
And you probably want to "group" the elements you put into the array for each article element, i.e. instead of
array_push($arr, $x, $y, $z);
you probably want
array_push($arr, array($x, $y, $z));

self-contained example:

<?php
$doc = getDoc();
$arr = foo($doc);
foreach($arr as $ad) {
  echo $ad['title'], " ", $ad['img'], "\n";
}

function foo(SimpleXMLElement $doc) {
  $availAds = array();
  $query = '//section/article';
  foreach( $doc->xpath($query) as $article ) {
    $currentTitle = $article->title ;
  //edit - mistake in code - $article used for all 
                  //$imagearray =  $currentimg->img ;
                  //$linkarray =  $currentlink->link ;
    array_push( $availAds, array(
      'title'=>(string)$article->title, // without the (string) cast 
      'img'=>(string)$article->img,  // you'd store simplexmlelement instances
      'link'=>(string)$article->link  // which _might or might not_ be what you want
    ));
  }
  return $availAds;
}

function getDoc() {
  return new SimpleXMLElement( <<< eoxml
<story>
  <section>
    <article>
      <title>title 1.1</title>
      <img>my image 1.1</img>
      <link>my link 1.1</link>
    </article>
    <article>
      <title>title 1.2</title>
      <img>my image 1.2</img>
      <link>my link 1.2</link>
    </article>
  </section>
  <section>
    <article>
      <title>title 2.1</title>
      <img>my image 2.1</img>
      <link>my link 2.1</link>
    </article>
  </section>
</story>
eoxml
  );
}

prints

title 1.1 my image 1.1
title 1.2 my image 1.2
title 2.1 my image 2.1
Sign up to request clarification or add additional context in comments.

1 Comment

thanks! With a bit of modification this was exactly what I needed to do.
0

Try something like this:

$xml="<story>
<article>
<title>my title</title>
<img>my image</img>
<link>my link</link>
</article>
</story>
";

$xml = new SimpleXMLElement($xml);

$availAds = array();

foreach($xml->article as $article):
    $currentTitle = (string)$article->title ;
    array_push( $availAds, $currentTitle );
endforeach;

print_r($availAds);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.