使用simplexml_load_string解析XML时缺少属性

时间:2018-05-24 04:13:57

标签: php xml simplexml

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

转换为数组后缺少属性。

2 个答案:

答案 0 :(得分:0)

您所说的<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>元素中的publication_date属性,依此类推。

答案 1 :(得分:0)

有一个非常简单的解决方案 - 删除这两行代码:

$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的外观的更多信息,因此我无法提供有关如何处理XML的更多信息,但有extensive examples in the PHP manualrefer here if there are namespaces (tags or attributes with : in their name)