繁体   English   中英

PHP XML XPATH节点元素迭代并插入到数组中

[英]PHP XML XPATH node element iteration and inserting into array

好的,所以我以为我已经钉了这个,但遗憾的是没有。 我有这个XML:

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

然后这个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;

所以我要做的是获取'Title''Img'和'Link'值并将它们插入到预先存在的数组中。 数组已使用先前输入的值输出正常,但我需要能够以这种方式输出更新数组的结果:

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

问题是现在,foreach为$ currentTitle,$ imagearray和$ linkarray返回NULL

正如戈登说:你需要的SimpleXML ,而不是DOM文档 / domxpath如果您要访问的子元素,比如$父- > childelements。
并且您可能希望将您放入数组中的元素“分组”为每个文章元素,即代替
array_push($arr, $x, $y, $z);
你可能想要的
array_push($arr, array($x, $y, $z));

自包含的例子:

<?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
  );
}

版画

title 1.1 my image 1.1
title 1.2 my image 1.2
title 2.1 my image 2.1

尝试这样的事情:

$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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM