Нет способа прочитать это напрямую с какой-либо из библиотек обработки XML, так как это недопустимый документ XML.Однако есть два способа сделать это.
Первый включает манипулирование тегом <?xml ?>
, чтобы сделать его обычным тегом, и завершение всего документа в общий тег (в данном случае <base>
)., но это не главное).Затем вы можете загрузить весь документ и извлечь данные как обычно ...
$data = str_replace(["<?", "?>"], ["<", "/>"], $data);
$xml = simplexml_load_string("<base>".$data."</base>");
foreach ( $xml->Properties->Property as $property ) {
echo $property->Prop_RefId.PHP_EOL;
}
echo PHP_EOL;
foreach ( $xml->Images->Image as $image ) {
echo $image->Prim_RefId.PHP_EOL;
}
echo PHP_EOL;
Все, что вам нужно помнить, это то, что над существующей структурой есть один уровень, поэтому я ссылаюсь на $xml->Properties->Property
.
Второе - разделить документ на части.Используя explode()
, берём тег <?xml ?>
в качестве разделителя, а затем обрабатываем каждую часть как обычно.Недостатком является то, что если объявление изменится, то это не удастся.Преимущество этого состоит в том, что он будет работать так же, если вы передадите исходный документ XML.
$list = explode("<?xml version='1.0'?>", $data );
$xml = simplexml_load_string ( $list[1] );
foreach ( $xml->Property as $property ) {
echo $property->Prop_RefId.PHP_EOL;
}
echo PHP_EOL;
$xml = simplexml_load_string ( $list[2] );
foreach ( $xml->Image as $image ) {
echo $image->Prim_RefId.PHP_EOL;
}
echo PHP_EOL;