如何在PHP中使用XML数据创建变量?

时间:2011-08-29 21:12:53

标签: php xml

现在试图解决这个问题,但现在运气好了,例如我有一个像这样的外部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

如果你不能将它们变成变量,你会如何将它们放入数组?

非常感谢任何帮助。

9 个答案:

答案 0 :(得分:1)

来自http://www.php.net/manual/en/function.xml-parse.php的PHP网站:

Ashok dot 893 at gmail dot com 26-Apr-2010 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
                )

        )

)

答案 1 :(得分:0)

您想要内置的课程Simplexml

答案 2 :(得分:0)

看看SimpleXML:

http://www.php.net/manual/en/simplexml.examples-basic.php

它将XML解析为“类似地图”的结构,然后您可以使用该结构来访问您的内容。对于您的具体情况,

$xml = new SimpleXMLElement($xmlstr);

$top_a =  $xml->template->positions[0] 

答案 3 :(得分:0)

最简单的方法是使用SimpleXML

$xml = simplexml_load_string(... your xml here...);

$values = array()
foreach($xml->positions as $pos) {
   $values[$pos] = $pos;
}

您不希望以您建议的方式自动创建变量 - 它会使用垃圾填充您的变量名称空间。考虑如果某人发送了一个包含<position>_SERVER</position>的XML片段并且您创建了该名称的变量的情况会发生什么 - 那就是你的$ _SERVER超全局。

答案 4 :(得分:0)

使用SimpleXML将文件解析为对象/数组结构,然后只需使用list

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

答案 5 :(得分:0)

为什么不直接做数组?

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);

答案 6 :(得分:0)

$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);

答案 7 :(得分:0)

$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中使用破折号创建变量

答案 8 :(得分:0)

<?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
                )

        )

)