получить данные атрибутов из xml между ключами (fromid = 1 toid = 3) в переполнении стека

я получил этот XML-файл: (items.xml)

<?xml version="1.0" encoding="iso-8859-1"?>
<items>
...
<item id="1546" article="a" name="item 1546 name">
<attribute key="weight" value="12000" />
<attribute key="slotType" value="two-handed" />
<attribute key="itemType" value="distance" />
<attribute key="range" value="5" />
<attribute key="hitChance" value="1" />
<attribute key="attack" value="3" />
</item>
...
<item id="4355" article="an" name="item 4355 name">
<attribute key="weight" value="19000" />
<attribute key="itemType" value="distance" />
<attribute key="range" value="5" />
<attribute key="hitChance" value="4" />
<attribute key="attack" value="9" />
</item>
...
<item fromid="6788" toid="6790" article="a" name="item 6788 or 6789 or 6790 name">
<attribute key="weight" value="1600" />
</item>
</items>

и мои сценарии все уже сделаны с использованием ключа id но некоторые теги не имеют ключа id, но fromid а также toid ключи вместо …

вот мои коды:

$c_item_reader = new XMLReader();
if (!$c_item_reader->open($config['site']['server_path'].'data/items/items.xml')) {
die("Failed to open 'items.xml'");
}
$item_fromdb = "1546 => 1, 6789 => 3";
$f_item = array();
$f_bits = explode(",",$item_fromdb);
foreach ($f_bits as $b) {
$b = str_replace('"', '', $b);
$bobs = explode(" => ", $b);
$f_item[$bobs[0]] = $bobs[1];
}
while($c_item_reader->read()) {
if ($c_item_reader->nodeType == XMLReader::ELEMENT && $c_item_reader->name == 'item') {
$id = $c_item_reader->getAttribute('id');
$fromid = $c_item_reader->getAttribute('fromid');
$toid = $c_item_reader->getAttribute('toid');
$name = $c_item_reader->getAttribute('name');
$item = $c_item_reader->expand();
$attributes = array();
foreach($item->childNodes as $attribute) {
if(get_class($attribute) != 'DOMElement') continue;
$attributes[] = (string) '"'.$attribute->getAttribute('key').'" => "'.$attribute->getAttribute('value').'"';
}
$ff_dsds = implode(",",$attributes);
foreach($f_item as $f_itemid => $f_itemamount){
if($id == $f_itemid){
$f_item_attr = array();
$f_bits_attr = explode(",",$ff_dsds);
foreach ($f_bits_attr as $b2) {
$b2 = str_replace('"', '', $b2);
$bobs2 = explode(" => ", $b2);
$f_item_attr[$bobs2[0]] = $bobs2[1];
}
foreach($f_item_attr as $f_attr_name => $f_attr_value){
if($l_attr_id == "weight")
$y_weight = $f_attr_value;
[...]
}
if($y_weight)
$f_weight = number_format($y_weight / 100, 2, '.', '');
echo $f_itemamount.'-'.$id.' => "weighs '.$f_weight.'", ';
}
}
}
}

вот результат печати, который я пытаюсь получить:

1-1546 => "weighs 120.00", 3-6789 => "weighs 16.00",

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …