用PHP解析和编写xml

时间:2012-02-25 05:51:36

标签: php xml parsing xml-parsing

我试图在php中解析一个xml文档,这有点难,因为xml由对象中的对象组成。这是xml:

<Bars>
<Bar>
<BarName>the bar name</BarName>
<bar_id>0</bar_id>
<Bartenders>
<Bartender><fname>a first name</fname><lname>a last name</lname><imageURL>an image url</imageURL><shift>2</shift></Bartender>
</Bartenders>
<Events>
<Event><EventName> event</EventName><date>08/10/1989</date></Event>
</Events>
<Specials>
<Special> Special 1</Special><Special> Special 2</Special>
</Specials>
</Bar>

显然,条形xml元素中有几个'bar'对象。我想要解决的是如何解析这个文件,将内容保存到数组,使用iOS应用程序的用户输入更新数组,最后将XML写回页面。我遇到的问题是,我怎样才能将几个'调酒师','事件'和'特殊'对象保存到相应栏的数组中?我将不得不在foreach数组中创建一个调酒器数组吗?我是否需要创建一个包含调酒师,事件和特殊数组的条形类?

到目前为止,这是我的一段PHP代码:

$bars = $doc->getElementsByTagName("Bar");
foreach($bars as $bar)
{
    $barNames = $bar->getElementsByTagName("BarName");
    $barName = $barNames->item(0)->nodeValue;
    array_push($barNameArray, $barName);


    echo "<b>barName:$barName</b><br>";
}

$barsArray = array();

//make any updates to the arrays as needed

for($i = 0; $i < count($barNameArray); $i++) // write an array of bar objects from the arrays created above

正如你所看到的,如果它只是每个条形的一种元素,我很容易理解它。我无法硬编码,因为我不知道在给定时间发布了多少调酒师,酒吧,特价等等...感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试使用此函数来获取XML的关联数组。

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

用法:

$xmlUrl = "nameit.xml"; // XML 
$xmlStr = file_get_contents($xmlUrl);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = objectsIntoArray($xmlObj);
print_r($arrXml);