XMLReader区分具有相同名称的嵌套节点

问题描述 投票:0回答:2

尝试使用外部xml文件进行堆叠,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<merchandiser xsi:noNamespaceSchemaLocation="merchandiser.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <header>
    <merchantId>44235</merchantId>
    <merchantName>Feelunique (UK)</merchantName>
    <createdOn>04/27/2020 00:05:33</createdOn>
  </header>
  <product part_number="99082" manufacturer_name="Sanctuary Spa" sku_number="99082" name="Sanctuary Spa Sleep Dream Easy Pillow Mist 100ml" product_id="15927186808">
    <URL>
      <product>https://click.linksynergy.com/link?id=y/LyuzvjryY&offerid=687217.15927186808&type=15&murl=https%3A%2F%2Fwww.feelunique.com%2Fp%2FSanctuary-Spa-Sleep-Dream-Easy-Pillow-Mist-100ml%26curr%3DGBP</product>
    </URL>
  </product>
</merchandiser>

您可以看到节点<product>被使用了两次,我需要从第一个获取属性,而在第二个获取值。

默认情况下,我的代码似乎直接跳到了第二个,并允许我定义第二个$xml->value节点的<product>,但是我似乎无法弄清楚如何在代码中将两者分开并获得我需要的属性。

            while($xml->read()) {

                if($xml->nodeType == XMLReader::ELEMENT) {

                    if($xml->localName == 'header') {

                        $header = array();

                    }

                    if($xml->localName == 'merchantName') {

                        $xml->read();
                        $header['merchant'] = addslashes($xml->value);

                    }

                    if($xml->localName == 'product') {

                        $product = array();
                        $product['merchant'] = $header['merchant'];
                        $product['title'] = $xml->getAttribute('name');

                    }

                    if($xml->localName == 'product') {

                        $xml->read();
                        $product['link'] = $xml->value;

                    }
}
}

有人可以为我指出如何在php代码中同时实现两个值的正确方向吗?

php xml xmlreader getattribute
2个回答
0
投票

这不是一个完整的解决方案,只是演示如何从两个product节点中的每个节点访问元素-您可以根据需要进行修改:


0
投票

XMLReader会从一个节点跳到另一个节点,并且在您点击'product'时,两个if语句都将评估为true。

© www.soinside.com 2019 - 2024. All rights reserved.