如何在PHP数组中分离HTML/XML标记


How to separate HTML/XML Tags in PHP Array?

我有一个数组,需要拆分参数。到目前为止,我已经尝试过:

$test = array
(
    'username' => 'vale',
    'apiaccesskey' => 'myapi',
    'action' => 'placeimeiorder',
    'requestformat' => 'JSON',
    'parameters' => '<PARAMETERS><CUSTOMFIELD>bnVsbA==</CUSTOMFIELD><ID>221</ID><IMEI>354443063506889</IMEI><MODELID></MODELID><PROVIDERID></PROVIDERID><NETWORK></NETWORK><PIN></PIN><KBH></KBH><MEP></MEP><PRD></PRD><TYPE></TYPE><LOCKS></LOCKS><REFERENCE></REFERENCE><SN></SN><SECRO></SECRO></PARAMETERS>',
    'version' => '2.3.1'
);

$html = $test['parameters'];
$doc = new DOMDocument();
$doc->loadHTML($html);     
$tags = $doc->getElementsByTagName('PARAMETERS');    
echo 'ID '.$tags->item(0)->getAttribute('ID').'" IMEI="'.$tags->item(0)->getAttribute('IMEI').'"/>';

作为回报,我得到了这个代码的致命错误,但它让我识别并分离标记值,这就是我想要的。以下是错误日志:

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Tag id invalid in Entity, line: 1 in /test.php on line 24
Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Tag imei invalid in Entity, line: 1 in /test.php on line 24
Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Tag modelid invalid in Entity, line: 1 in /test.php on line 24
Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Tag providerid invalid in Entity, line: 1 in /test.php on line 24
....

我想要的阵列输出:

'CUSTOMFIELD' = 'bnVsbA==',
'ID' = '221',
'IMEI' = '354443063506889',
'MODELID' = '',
'PROVIDERID' = '',
'NETWORK' = '',
..so on..

所以我可以使用echo $test['IMEI'];,它将输出:354443063506889

如何解决此错误并在$test['parameters']中分离所有标签?

谢谢你的帮助。

看起来parameters是xml,所以应该使用loadXML函数,请参见下面的示例:

$test = array
(
    'username' => 'vale',
    'apiaccesskey' => 'myapi',
    'action' => 'placeimeiorder',
    'requestformat' => 'JSON',
    'parameters' => '<PARAMETERS><CUSTOMFIELD>bnVsbA==</CUSTOMFIELD><ID>221</ID><IMEI>354443063506889</IMEI><MODELID></MODELID><PROVIDERID></PROVIDERID><NETWORK></NETWORK><PIN></PIN><KBH></KBH><MEP></MEP><PRD></PRD><TYPE></TYPE><LOCKS></LOCKS><REFERENCE></REFERENCE><SN></SN><SECRO></SECRO></PARAMETERS>',
    'version' => '2.3.1'
);
$html = $test['parameters'];
$doc = new DOMDocument();
$doc->loadXML($html);
$tags = $doc->getElementsByTagName('ID');
$id = $tags->item(0)->nodeValue;
$tags = $doc->getElementsByTagName('IMEI');
$imei = $tags->item(0)->nodeValue;
echo 'ID="'.$id.'" ,  IMEI="'.$imei.'"';

要获得阵列中的所有元素,您可以使用以下解决方案:

$html = $test['parameters'];
$doc = new DOMDocument();
$doc->loadXML($html);
$tags = $doc->getElementsByTagName('PARAMETERS');
$root = $doc->documentElement;
foreach($root->childNodes as $node){
    $attributes[$node->nodeName] = $node->nodeValue;
}
print_r($attributes);

这将执行您想要的操作:(完整的工作示例)

<?php
$test = Array
(
    'username' => 'vale',
    'apiaccesskey' => 'myapi',
    'action' => 'placeimeiorder',
    'requestformat' => 'JSON',
    'parameters' => '<PARAMETERS><CUSTOMFIELD>bnVsbA==</CUSTOMFIELD><ID>221</ID><IMEI>354443063506889</IMEI><MODELID></MODELID><PROVIDERID></PROVIDERID><NETWORK></NETWORK><PIN></PIN><KBH></KBH><MEP></MEP><PRD></PRD><TYPE></TYPE><LOCKS></LOCKS><REFERENCE></REFERENCE><SN></SN><SECRO></SECRO></PARAMETERS>',
    'version' => '2.3.1'
);

$html = $test['parameters'];
$doc = new DOMDocument();
$doc->loadXML($html);     
$p = $doc->getElementsByTagName('PARAMETERS')->item(0);
$opts=array();
foreach($p->getElementsByTagName('*') as $item)
{
    $opts[$item->nodeName]=$item->nodeValue;
}
echo '<pre>'.print_r($opts,true).'</pre>';
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML('...');
libxml_clear_errors();

要忽略警告,请使用libxml_use_internal_errors(true);在CCD_ 6功能之前。