Отсутствуют атрибуты при разборе XML с помощью simplexml_load_string - PullRequest
0 голосов
/ 24 мая 2018
$xml = simplexml_load_string($value);
$json = json_encode($xml); // convert the XML string to JSON
$array = json_decode($json,TRUE);

Атрибуты отсутствуют после преобразования в массив.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Существует очень простое решение - удалите эти две строки кода:

$json = json_encode($xml); // convert the XML string to JSON
$array = json_decode($json,TRUE);

Массивы XML, JSON и PHP имеют разные правила относительно того, какие структуры могут быть представлены, поэтому преобразованиепроизвольно между ними всегда заканчивается крайними случаями, когда вы пропускаете данные.SimpleXML, как следует из названия, предназначен для простого в использовании , поэтому вам будет гораздо полезнее его использовать:

$xml = simplexml_load_string($value);
// Now access your data from $xml; no further conversion is needed 

Поскольку вы не предоставляете никакой дополнительной информации о том, что вашПохоже, что XML, я не могу дать никакой дополнительной информации о том, как его обрабатывать, но в руководстве по PHP есть подробные примеры *1012*, и см. Здесь, если есть пространства имен (теги или атрибуты с : в их названии) .

0 голосов
/ 25 мая 2018

Как вы говорите, значение <SampleData> закодировано. Самый простой способ вернуть его в «нормальное состояние» - это использовать htmlspecialchars_decode() для преобразования всех символов перед загрузкой строки в SimpleXML.Приведенный ниже код делает это, а затем выводит различные части данных в качестве примера того, как отображать информацию ...

$source = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=biosample&id=367368";
$value = file_get_contents($source);
$value = htmlspecialchars_decode($value);
$xml = simplexml_load_string($value);
// Access the DbBuild value
echo "DbBuild=".(string)$xml->DocumentSummarySet->DbBuild.PHP_EOL;
// The BioSample publication date attribute
echo "BioSample publication date=".(string)$xml->DocumentSummarySet->DocumentSummary->SampleData->BioSample['publication_date'].PHP_EOL;
// List the attributes name and value
foreach ( $xml->DocumentSummarySet->DocumentSummary->SampleData->BioSample->Attributes->Attribute as $attribute )   {
    echo (string)$attribute['attribute_name']."=".(string)$attribute.PHP_EOL;
}

Некоторый доступ XML выглядит запутанным, но это всего лишь случай доступа кразличные уровни данных в документе.$xml->DocumentSummarySet обращается к элементу <DocumentSummarySet> под корневыми элементами.BioSample['publication_date'] - это атрибут публикации_даты в элементе <BioSample> и т. Д.

...