簡體   English   中英

如何在PHP中從XML數據創建變量?

[英]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超全局變量就存在了。

使用SimpleXML將文件解析為對象/數組結構,然后只需使用list

$sxml = new SimpleXMLElement($xml);
$positions = (array)$sxml->positions->children();
list($top_a, $top_b, $sidebar_a, $footer_a) = $positions['position'];

為什么不直接做數組?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM