首页 > 解决方案 > 如何在 PHP 中使用 DOM 或 XPATH 获取最近的子节点而不是嵌套的子节点

问题描述

有一些这样的 XML 产品提要:

<SHOP>
  <SHOPITEM id="2927" import-code="PREMIER">
    <NAME>productname</NAME>
    <DESCRIPTION>Blah, blah, blah ...</DESCRIPTION>
    <RELATED_PRODUCTS>
      <CODE>PXP-01-01</CODE>
      <CODE>PXP-01-02</CODE>
      <CODE>PXP-01-03</CODE>
    </RELATED_PRODUCTS>
    <FLAGS>
      <FLAG>
        <CODE>news</CODE>
        <ACTIVE>1</ACTIVE>
      </FLAG>
      <FLAG>
        <CODE>action</CODE>
        <ACTIVE>0</ACTIVE>
      </FLAG>
    </FLAGS>
    <CODE>PXS-01-MNCRFT</CODE>
    <EAN>0702811692053</EAN>
    <WEIGHT>0.5</WEIGHT>
    <PRICE>123</PRICE>
    <VAT>21</VAT>
  </SHOPITEM>
</SHOP>

并且需要在 PHP 循环中获取产品代码。看起来很容易,但使用$item->getElementsByTagName("CODE")是不可能的,因为我不知道正确的一个 CODE 节点的订单 ID。我尝试过使用 XPATH,但我完全迷失了,不知道如何构造查询以仅获取 SHOP > SHOPITEM > CODE 中的 CODE 值以及所有其他 inSHOP > SHOPITEM > RELATED_PRODUCTS > CODE或 inFLAG > CODE或 in ALTERNATIVE_PRODUCTS > CODE... 如何排除这些或最好确切地问正确的?

标签: phpxmldomxpath

解决方案


使用xpath,这样试试

$dom = new DOMDocument();
$dom->loadXML($xml_string);
$xpath = new DOMXPath($dom);

$flags = $xpath->query('//SHOPITEM//FLAGS');
foreach ($flags as $flag)
{   
    foreach ($xpath->query('.//FLAG/CODE',$flag) as $target) {
    echo $target->nodeValue ."\n";}
};

输出:

news
action

下一个:

$codes = $xpath->query('//SHOPITEM/CODE');

foreach ($codes as $code)
{   
    foreach ($codes as $code) {
    echo $code->nodeValue ."\n";}
};

输出:

PXS-01-MNCRFT

最后:

$rps = $xpath->query('//SHOPITEM/RELATED_PRODUCTS');
foreach ($rps as $rp)
{   
    foreach ($xpath->query('.//CODE',$rp) as $target) {
    echo $target->nodeValue ."\n";}
};

输出:

PXP-01-01
PXP-01-02
PXP-01-03

推荐阅读