2015-12-15 88 views
1

我有一個數組,需要拆分參數。到目前爲止,我曾嘗試:如何在PHP數組中分離HTML/XML標籤?

$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').'"/>'; 

作爲回報,我得到致命錯誤與此代碼,但它SeeME所它recognizong和分離標籤值,這就是希望。下面是錯誤日誌:

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'];,它會輸出:

我該如何解決這個錯誤,並得到在$test['parameters']分離的所有標籤?

謝謝你的幫助。

+0

你可以發佈你想要的輸出嗎? –

+0

'loadHTML()'是用於HTML的。由於您的輸入是XML,請使用'loadXML()'代替。 – Ultimater

+0

@DishaV。更新我的問題。 – Cyborg

回答

0
$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML('...'); 
libxml_clear_errors(); 

要忽略警告,請使用libxml_use_internal_errors(true);之前loadHTML()功能。

2

看來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); 
+0

好的解決方案,正如我想要的那樣工作:)謝謝! – Cyborg

+0

@Cyborg謝謝:) –

1

這將做什麼你想:(完整的工作示例)

<?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>'; 
+0

不錯的解決方案,完全按照我的想法:)謝謝一百萬! – Cyborg