我正在使用来自公共 NHS API 的位置和地址数据,它以 XML 格式输入,我已将其转换为 JSON 以在我的 web 应用程序中使用。
我的代码正在运行并产生所需的结果,但是我不禁对这段代码中嵌套的 foreach 循环的数量感到畏缩。
有没有更干净的方法来实现相同的结果,并且性能更高?
我曾尝试使用 simplexml_load_string 和许多变体,但它拒绝输出/解析包含 s:organisationSummary 数据的嵌套元素的内容。
这是 PHP 类
class XmlElement {
public $name;
public $attributes;
public $content;
public $children;
}
class GpService
{
protected $apiKey;
public function __construct()
{
$this->apiKey = env('NHS_API_KEY');
}
public function xmlToObject($xml) {
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $xml, $tags);
xml_parser_free($parser);
$elements = array(); // the currently filling [child] XmlElement array
$stack = array();
foreach ($tags as $tag) {
$index = count($elements);
if ($tag['type'] == "complete" || $tag['type'] == "open") {
$elements[$index] = new XmlElement;
$elements[$index]->name = $tag['tag'];
$elements[$index]->attributes = (isset($tag['attributes']))?$tag['attributes']:null;
$elements[$index]->content = (isset($tag['value']))?$tag['value']:null;
if ($tag['type'] == "open") { // push
$elements[$index]->children = array();
$stack[count($stack)] = &$elements;
$elements = &$elements[$index]->children;
}
}
if ($tag['type'] == "close") { // pop
$elements = &$stack[count($stack) - 1];
unset($stack[count($stack) - 1]);
}
}
return $elements[0]; // the single top-level element
}
}
}
繁花不似锦
冉冉说