PHP XML получить атрибуты элемента по значению атрибута - PullRequest
0 голосов
/ 17 октября 2019

У меня есть файл xml, который имеет такую ​​структуру:

<products>
    <group>
        <product id="853" symbol="XYZ123" stock="73"></product>
        <product id="941" symbol="ERX412" stock="57"></product>
        <product id="1960" symbol="UIX981" stock="21"></product>
        ...
    </group>
</products>

Мне нужно извлечь из него только определенные продукты, поэтому я использую этот код:

$xml = simplexml_load_file( 'products.xml', null, LIBXML_NOCDATA );
$ids = [853, 1960];
foreach($ids as $id){
    $data = $xml->xpath('//group/product[@id='.$id.']');
    $arr[$id] = $data;
}

Это хорошо работает, чтобы получить полный <product>, но мне нужно получить только запас определенных продуктов (например, для product id 853 stock = 73).

Какой лучший способ сделать это?

РЕДАКТИРОВАТЬ [ОБНОВЛЕНИЕ]

Я закончил цикл через элементы:

foreach($xml->group->product as $element){
    $xml_id = (string)$element->attributes()->id;

    if(in_array($xml_id, $ids)){
        $arr[$xml_id] = $element->attributes()->stock;
    }
}

Это, безусловно, не лучшая идея в мире, но она работает для меня. Я приду с обновлением, если когда-нибудь найду ответ, который не требует зацикливания, как я делаю это прямо сейчас.

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Вы можете использовать json_decode с json_encode и simplexml_load_string ИЛИ simplexml_load_file

$array = json_decode(json_encode((array)simplexml_load_string($xml)),true);//use `simplexml_load_file`
foreach($array['group']['product'] as $v){
  $cur    = $v['@attributes']['id'];
  $stock  = $v['@attributes']['stock'];
  in_array($cur, $ids) ? ($res[$cur] = $stock) : '';
}
print_r($res);

Рабочий пример: - https://3v4l.org/5PZYp

0 голосов
/ 18 октября 2019

Просто небольшая настройка вашего кода, основная часть - это способ получения данных из результатов XPath. Поскольку это будет список совпадений - вам нужно использовать [0], а также ['stock'], чтобы получить атрибут stock. Наконец, преобразуйте его в строку, чтобы убедиться, что вы получите значение, а не SimpleXMLElement ...

foreach($ids as $id){
    $data = $xml->xpath('//group/product[@id='.$id.']');
    $arr[$id] = (string)$data[0]['stock'];
}
0 голосов
/ 17 октября 2019

В вашем foreach:

$attributes = $data->attributes();

Этот метод возвращает массив атрибутов, в вашем случае id, symbol и stock. Затем вы можете получить значение атрибута stock с помощью:

$attributes['stock']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...