[英]How do I create variables from XML data in PHP?
一直想嘗試一小會兒,但是現在運氣不錯,例如,我有一個像這樣的外部xml文檔:
<?xml version="1.0" ?>
<template>
<name>My Template Name</name>
<author>John Doe</author>
<positions>
<position>top-a</position>
<position>top-b</position>
<position>sidebar-a</position>
<position>footer-a</position>
</positions>
</template>
如何處理此文檔以創建如下變量:
$top-a = top-a;
$top-b = top-b;
$sidebar-a = sidebar-a;
$footer-a = footer-a
如果不能將它們變成變量,如何將它們放入數組中?
任何幫助將不勝感激。
從PHP網站http://www.php.net/manual/zh/function.xml-parse.php :
gmail dot com上的Ashok dot 893 2010年4月26日05:52這是將所有適用對象轉換為關聯數組的非常簡單的方法。 這不僅適用於SimpleXML,而且適用於任何對象。 輸入可以是數組或對象。 此函數還采用options參數作為要在返回數組中排除的索引數組。 並請記住,由於使用函數get_object_vars(),因此這僅返回對象的非靜態和可訪問變量的數組。
<?php
function objectsIntoArray($arrObjData, $arrSkipIndices = array())
{
$arrData = array();
// if input is object, convert into array
if (is_object($arrObjData)) {
$arrObjData = get_object_vars($arrObjData);
}
if (is_array($arrObjData)) {
foreach ($arrObjData as $index => $value) {
if (is_object($value) || is_array($value)) {
$value = objectsIntoArray($value, $arrSkipIndices); // recursive call
}
if (in_array($index, $arrSkipIndices)) {
continue;
}
$arrData[$index] = $value;
}
}
return $arrData;
}
?>
Usage:
<?php
$xmlUrl = "feed.xml"; // XML feed file/URL
$xmlStr = file_get_contents($xmlUrl);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = objectsIntoArray($xmlObj);
print_r($arrXml);
?>
這將產生以下結果:
Array
(
[name] => My Template Name
[author] => John Doe
[positions] => Array
(
[position] => Array
(
[0] => top-a
[1] => top-b
[2] => sidebar-a
[3] => footer-a
)
)
)
<?php
$xmlUrl = "feed.xml"; // XML feed file/URL
$xmlStr = file_get_contents($xmlUrl);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = json_decode(json_encode($xmlObj), true); # the magic!!!
print_r($arrXml);
?>
這將產生以下結果:
Array
(
[name] => My Template Name
[author] => John Doe
[positions] => Array
(
[position] => Array
(
[0] => top-a
[1] => top-b
[2] => sidebar-a
[3] => footer-a
)
)
)
您需要內置類Simplexml
看一下SimpleXML:
http://www.php.net/manual/en/simplexml.examples-basic.php
它將XML解析為“類似地圖”的結構,然后您可以使用該結構訪問您的內容。 對於您的特定情況,
$xml = new SimpleXMLElement($xmlstr);
$top_a = $xml->template->positions[0]
最簡單的方法是使用SimpleXML :
$xml = simplexml_load_string(... your xml here...);
$values = array()
foreach($xml->positions as $pos) {
$values[$pos] = $pos;
}
您不想以您建議的方式自動創建變量-它會用亂碼亂扔變量名空間。 請考慮一下,如果有人發送具有<position>_SERVER</position>
的XML代碼片段,並且您創建了該名稱的變量,那會發生什么情況-$ _SERVER超全局變量就存在了。
為什么不直接做數組?
var positions = document.getElementsByTagName("positions");
var positions_final_arr = [];
for(int i = 0; i < positions.length; i++){
positions_final_arr[i] = [];
var inner_pos = positions[i].getElementsbyTagName("position");
for(int l = 0; l < inner_pos.length; l++){
positions_final_arr[i][l] = inner_pos[i].value;
}
}
console.log(positions_final_arr);
$str = "your xml";
$xml = simplexml_load_string($str);
$result = array();
foreach ($xml->positions as $pos) {
foreach ($pos->position as $p) {
$element = (string)$p[0];
$result[$element] = $element;
}
}
var_dump($result);
$dom = new DOMDocument;
$dom->loadXML('<root><position>a</position></root>'); //your string here
//$dom->loadXML(file_get_contents($file_with_pxml)); - from file
$position = $dom->getElementsByTagName('position');
for ($i=0; $i<$position->length; $i++)
{
$item = $position->item($i);
${$item->nodeValue} = $item->nodeValue;//$$item->nodeValue = $item->nodeValue;
}
但據我所知-您無法在PHP中使用名稱中的破折號創建變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.