如何使用Xpath过滤XML导出的搜索?

时间:2018-08-07 13:10:10

标签: php xml xpath

我目前正在房地产网站上工作。通过URL从XML导出中检索属性的数据。有出售和出租的物业,但位于两个不同的地理位置。我想做的是两个页面,每个页面对应一个位置并显示该位置的房屋和公寓,但没有租金。该位置由经纪人ID(此处为“ NEGOCIATEUR_ID”)设置。

XML是这样的:

<BIEN>
 <INFO_GENERALES>...</INFO_GENERALES>
 <AGENCE>...</AGENCE>
 <NEGOCIATEUR>
   <NEGOCIATEUR_ID>452329</NEGOCIATEUR_ID>
 </NEGOCIATEUR>
 <VENTE>...</VENTE>
 <MAISON>...</MAISON>
 <LOCALISATION>...</LOCALISATION>
</BIEN>

这是我当前的PHP代码:

<?php

 class noeud_parent extends SimpleXMLElement
 {
   public function get_parent_node()
   {
    // return current($this->xpath('//BIEN/* | //BIEN/NEGOCIATEUR[NEGOCIATEUR_ID=436344] | not //BIEN/LOCATION'));
    return current($this->xpath('parent::*'));
   }
  }

  $url = 'http://clients.ac3-distribution.com/office5/ageprim/cache/export.xml';
  $xml = simplexml_load_file($url, 'noeud_parent');

  $maisons = $xml->xpath('//BIEN/MAISON[SS_TYPE=2]');
  $appartements = $xml->xpath('//BIEN/APPARTEMENT[SS_TYPE=1]');

 ?>

公共函数中的注释行是我想要的结果(当然,它不是这样工作的:/)。而且我什至没有排除租金(如果是租金,则用<LOCATION>代替)...甚至有可能在一行中全部完成吗?

这是HTML:

<?php foreach ($maisons as $bien): ?>
  <article class="bien">
    <div class="photo_bien"><img src="<?= $bien->get_parent_node()->IMAGES->IMG[0] ?>"/></div>
    <h4><?= $bien->get_parent_node()->LOCALISATION->VILLE ?></h4>
    <p><?= $bien->get_parent_node()->INTITULE->FR ?></p>
    <p><strong>Nbre de pièces :</strong> <?= $bien->get_parent_node()->MAISON->NBRE_PIECES ?></p>
    <a href="annonce.php?aff_id=<?= $bien->get_parent_node()->INFO_GENERALES->AFF_ID ?>">VOIR PLUS</a>
  </article>
<?php endforeach ?>

get_parent_node函数可帮助我向后退以从相同级别的节点获取信息。但是我无法使用“ NEGOCIATEUR_ID”对其进行过滤...

对不起,如果我对这么多代码进行垃圾邮件散布,但是我的PHP技能是基础知识,那么我就会陷入这个问题!总结一下:请帮忙!谢谢!

2 个答案:

答案 0 :(得分:0)

似乎您想获取满足特定条件的BIEN元素节点。您应该从头开始,而不要获取MAISONAPPARTEMENT元素节点:

$xml = <<<'XML'
<BIEN>
 <INFO_GENERALES>...</INFO_GENERALES>
 <AGENCE>...</AGENCE>
 <NEGOCIATEUR>
   <NEGOCIATEUR_ID>452329</NEGOCIATEUR_ID>
 </NEGOCIATEUR>
 <VENTE>...</VENTE>
 <MAISON>
   <SS_TYPE>2</SS_TYPE>
 </MAISON>
 <LOCALISATION>...</LOCALISATION>
</BIEN>
XML;

$xml = simplexml_load_string($xml);
foreach ($xml->xpath('//BIEN[MAISON/SS_TYPE=2 and NEGOCIATEUR/NEGOCIATEUR_ID = 452329]') as $bien) {
  var_dump(
      (string)$bien->NEGOCIATEUR->NEGOCIATEUR_ID
  );
}

输出:

string(6) "452329"
Xpath表达式
  • 获取任何BIEN元素节点...
    //BIEN
  • ...的MAISONSS_TYPE等于2 ...
    //BIEN[MAISON/SS_TYPE=2]
  • ...并且有一个NEGOCIATEUR,且NEGOCIATEUR_ID等于452329 ...
    //BIEN[MAISON/SS_TYPE=2 and NEGOCIATEUR/NEGOCIATEUR_ID = 452329]

答案 1 :(得分:0)

是的!!我曾尝试使用'and'进行此类指令,但语法错误!它是这样的:

$maisons = $xml->xpath('//BIEN[MAISON/SS_TYPE=2 and NEGOCIATEUR/NEGOCIATEUR_ID = 452329]');
$appartements = $xml->xpath('//BIEN[APPARTEMENT/SS_TYPE=1 and NEGOCIATEUR/NEGOCIATEUR_ID = 452329]');

我正试图用xquery和Zorba找到答案,但是考虑到我的问题,它会变得非常复杂:| ...

在您的解决方案中,我的get_parent_node函数无效,HTML看起来像这样:

  <?php foreach ($maisons as $bien): ?>
<article class="bien">
  <div class="photo_bien"><img src="<?= $bien->IMAGES->IMG[0] ?>"/></div>
  <h4><?= $bien->LOCALISATION->VILLE ?></h4>
  <p><strong>Prix :</strong> <?= $bien->VENTE->PRIX ?> euros</p>
  <p><strong>Agence :</strong> <?= $bien->AGENCE->AGENCE_VILLE ?></p>
  <a href="annonce.php?aff_id=<?= $bien->INFO_GENERALES->AFF_ID ?>">VOIR PLUS</a>
</article>
  

所以,我非常感谢您!