在PHP中编写XML字符串

时间:2012-02-24 13:49:46

标签: php xml

我正在尝试构建一个XML字符串作为HTTP请求的主体传递,但我有点卡住了。这是应该构建字符串的函数:

    public function build_calendarquery()
{

    $body = '<?xml version="1.0" encoding="utf-8" ?>
                    <C:'.$this->report_type.' xmlns:D="DAV:"
                    xmlns:C="urn:ietf:params:xml:ns:caldav">
                    <D:prop>
                        <D:getetag/>
                        <C:calendar-data>
                        <C:comp name="VCALENDAR">
                        <C:prop name="VERSION"/>
                        <C:comp name="VEVENT">'; 

        foreach($this->cal_props as $prop)
        {
            $body .= '<C:prop name="'.strtoupper($prop).'" />';                                                                
        }

        $body .= '</C:comp>';

        $body .= '<C:comp name="VTIMEZONE" />
                    </C:comp>
                        </C:calendar-data>
                        </D:prop>';

        if($this->filters){

            $body .= '<C:filter>
                        <C:comp-filter name="VCALENDAR">
                            <C:comp-filter name="VEVENT">';

            foreach($this->filters as $filter=>$val) 
            {
                $body .= '<C:'.$filter.' '.$val.'/>';
            }

            $body .= '</C:comp-filter>
                        </C:comp-filter>
                            </C:filter>';
        }

        $body .= '</C:calendar-query>'; 

        return $body;
}

我遇到的问题是,当我尝试使用从此函数返回的数据时,似乎没有任何东西。我的意思是,如果我写:

var_dump($this->build_calendarquery()); 

返回NULL。

我之前从未真正使用过XML。我错过了一些非常明显的东西吗?

3 个答案:

答案 0 :(得分:1)

所以我在本地测试了你的代码,你提供的部分没有任何问题。

<?php
class Test
{
    public $report_type="foo";
    public $cal_props = array();
    public $filters = array();
    public function build_calendarquery()
    {

        $body = '<?xml version="1.0" encoding="utf-8" ?>
                        <C:'.$this->report_type.' xmlns:D="DAV:"
                        xmlns:C="urn:ietf:params:xml:ns:caldav">
                        <D:prop>
                            <D:getetag/>
                            <C:calendar-data>
                            <C:comp name="VCALENDAR">
                            <C:prop name="VERSION"/>
                            <C:comp name="VEVENT">'; 

            foreach($this->cal_props as $prop)
            {
                $body .= '<C:prop name="'.strtoupper($prop).'" />';                                                                
            }

            $body .= '</C:comp>';

            $body .= '<C:comp name="VTIMEZONE" />
                        </C:comp>
                            </C:calendar-data>
                            </D:prop>';

            if($this->filters){

                $body .= '<C:filter>
                            <C:comp-filter name="VCALENDAR">
                                <C:comp-filter name="VEVENT">';

                foreach($this->filters as $filter=>$val) 
                {
                    $body .= '<C:'.$filter.' '.$val.'/>';
                }

                $body .= '</C:comp-filter>
                            </C:comp-filter>
                                </C:filter>';
            }

            $body .= '</C:calendar-query>'; 

            return $body;
    }
    public function doVarDump()
    {
        var_dump($this->build_calendarquery());
    }
}

$test = new Test();
var_dump($test->build_calendarquery());
$test->doVarDump();
?>

输出:

string '<?xml version="1.0" encoding="utf-8" ?>
                        <C:foo xmlns:D="DAV:"
                        xmlns:C="urn:ietf:params:xml:ns:caldav">
                        <D:prop>
                            <D:getetag/>
                            <C:calendar-data>
                            <C:comp name="VCALENDAR">
                            <C:prop name="VERSION"/>
                            <C:comp name="VEVENT"></C:comp><C:comp name="VTIMEZONE" />
                        </C:comp>
                            </C:calendar-data>
                            </D:prop></C:calendar-query>' (length=383)
string '<?xml version="1.0" encoding="utf-8" ?>
                        <C:foo xmlns:D="DAV:"
                        xmlns:C="urn:ietf:params:xml:ns:caldav">
                        <D:prop>
                            <D:getetag/>
                            <C:calendar-data>
                            <C:comp name="VCALENDAR">
                            <C:prop name="VERSION"/>
                            <C:comp name="VEVENT"></C:comp><C:comp name="VTIMEZONE" />
                        </C:comp>
                            </C:calendar-data>
                            </D:prop></C:calendar-query>' (length=383)

您需要向我们展示更多代码。我对你的var_dump($this->build_calendarquery());声明的位置感兴趣。

答案 1 :(得分:0)

使用类或尝试将函数声明移除到public并检查所有变量,如($ this-&gt; report_type,$ this-&gt; cal_props ... etc)... etc

我怀疑$ this-&gt; cal_props

我尝试下面的代码
注意: - 删除所有$ this变量

function build_calendarquery()

{

$body = '<?xml version="1.0" encoding="utf-8" ?>
                <C: xmlns:D="DAV:"
                xmlns:C="urn:ietf:params:xml:ns:caldav">
                <D:prop>
                    <D:getetag/>
                    <C:calendar-data>
                    <C:comp name="VCALENDAR">
                    <C:prop name="VERSION"/>
                    <C:comp name="VEVENT">'; 



    $body .= '</C:comp>';

    $body .= '<C:comp name="VTIMEZONE" />
                </C:comp>
                    </C:calendar-data>
                    </D:prop>';



        $body .= '<C:filter>
                    <C:comp-filter name="VCALENDAR">
                        <C:comp-filter name="VEVENT">';



        $body .= '</C:comp-filter>
                    </C:comp-filter>
                        </C:filter>';


    $body .= '</C:calendar-query>'; 

    return $body;

} 的var_dump(build_calendarquery());
输出为字符串(792)“”

答案 2 :(得分:-2)

var_dump不适用于函数。尝试将函数的结果存储在变量中,然后var_dump:

$result = $this->build_calendarquery();
var_dump($result);

另外,我不知道当你跨越多行的单引号字符串时PHP是否喜欢它...