停止大于符号转换为HTML实体

时间:2011-07-23 23:30:53

标签: php xml wordpress plugins

我在PHP中编写了一些未经验证的XML,因为CDATA元素上的大于号的结束正在转换为HTML实体。代码如下:

$xml .= '<item number="'.$i.'">
                <sku>'.$this->get_product_sku($key, $value).'</sku>
                <description>
                    <![CDATA[
                    '.get_the_title($value['prodid']).'
                    ]]>
                </description> 
                <qty>'.$value['quantity'].'</qty>
                <price>'.$value['price'].'</price> 
                <extended>'.$value['quantity']*$value['price'].'</extended>
            </item>';

使用var_dumpprint_r打印时,生成的XML看起来如下所示:

<item number="2"> 
            <sku>45NK2</sku> 
            <description> 
                <![CDATA[
                Test Product
                ]]&gt;
            </description> 
            <qty>2</qty> 
            <price>1500.00</price> 
            <extended>3000.00</extended> 
        </item>

结束>变为&gt;,XML无法验证。有人可以帮我解决这个问题吗?

谢谢!

编辑:这是生成XML的整个函数。我只打电话打印这个功能。字符串无效,无效。

function build_xml($p, $c)
{
    global $wpdb;

    // Make the billing and shipping data available
    $this->determine_shipping_details($p, $c);
    $this->determine_billing_details($p, $c);

    // Build the XML
    $xml = '<?xml version="1.0" ?>
        <orderdata batch="'.$p['id'].'">
            <order id="'.$p['id'].'">
                <orderdate>'.date('m/d/Y h:i:s', $p['date']).'</orderdate>
                <store>'.$this->store_id.'</store>
                <adcode>OL</adcode>
                <username>'.$this->username.'</username>
                <password>'.$this->password.'</password>
                <billingaddress>
                    <firstname>'.$this->billing_details['first_name'].'</firstname>
                    <lastname>'.$this->billing_details['last_name'].'</lastname>
                    <address1>'.$this->billing_details['address'].'</address1>
                    <city>'.$this->billing_details['city'].'</city>
                    <state>'.$this->billing_details['state'].'</state>
                    <zipcode>'.$this->billing_details['zip'].'</zipcode>
                    <country>'.$this->billing_details['country'].'</country>
                    <phone>'.$this->billing_details['phone'].'</phone>
                    <email>'.$this->billing_details['email'].'</email>
                </billingaddress>
                <shippingaddress>
                    <firstname>'.$this->shipping_details['first_name'].'</firstname>
                    <lastname>'.$this->shipping_details['last_name'].'</lastname>
                    <address1>'.$this->shipping_details['address'].'</address1>
                    <city>'.$this->shipping_details['city'].'</city>
                    <state>'.$this->shipping_details['state'].'</state>
                    <zipcode>'.$this->shipping_details['zip'].'</zipcode>
                    <country>'.$this->shipping_details['country'].'</country>
                    <phone>'.$this->shipping_details['phone'].'</phone>
                    <email>'.$this->shipping_details['email'].'</email>
                </shippingaddress>
                <orderdetails>';

    // Add the individual items' information to the XML
    $i = 1;
    foreach($c as $key => $value)
    {
        $xml .= '<item number="'.$i.'">
            <sku>'.$this->get_product_sku($key, $value).'</sku>
            <description>
                <![CDATA[
                '.get_the_title($value['prodid']).'
                ]]>
            </description> 
            <qty>'.$value['quantity'].'</qty>
            <price>'.$value['price'].'</price> 
            <extended>'.str_replace(stripslashes( get_option('wpsc_thousands_separator') ), '', trim(wpsc_currency_display($value['quantity']*$value['price'], array('display_currency_symbol' => false, 'display_decimal_point' => true, 'display_currency_code' => false, 'display_as_html' => false)))).'</extended>
        </item>';

        $i++;
    }

    // Add the order totals
    $xml .= '<subtotal>'.str_replace(stripslashes( get_option('wpsc_thousands_separator') ), '', trim(wpsc_currency_display($p['totalprice']-$p['wpec_taxes_total']-$p['base_shipping'], array('display_currency_symbol' => false, 'display_decimal_point' => true, 'display_currency_code' => false, 'display_as_html' => false)))).'</subtotal>
        <shipping code="'.'FEG'.'" rate="'.$p['base_shipping'].'" thirdparty="">'.'FEDEX GROUND SERVICE'.'</shipping> 
        <tax rate="'.$p['wpec_taxes_rate'].'">'.$p['wpec_taxes_total'].'</tax>
        <total>'.$p['totalprice'].'</total>
        <amountpaid>'.$p['totalprice'].'</amountpaid>
    </orderdetails>';

    // Close out the tags
    $xml .= '</order>
    </orderdata>';

    return $xml;
}

4 个答案:

答案 0 :(得分:1)

当我在我的网络服务器上运行它时,它的格式正确。你在设置标题吗? 尝试     header('Content-type: text/xml');
echo $xml;

答案 1 :(得分:0)

尝试使用html_entity_decode()htmlspecialchars_decode()。要么适用于这种情况。

http://www.php.net/manual/en/function.html-entity-decode.php http://www.php.net/manual/en/function.htmlspecialchars-decode.php

故意编码:

$xml .= '<item number="'.$i.'">
                <sku>'.$this->get_product_sku($key, $value).'</sku>
                <description>
                    &lt;![CDATA[
                    '.get_the_title($value['prodid']).'
                    ]]&gt;
                </description> 
                <qty>'.$value['quantity'].'</qty>
                <price>'.$value['price'].'</price> 
                <extended>'.$value['quantity']*$value['price'].'</extended>
            </item>';

然后在显示屏上解码:

echo html_entity_decode($xml);

答案 2 :(得分:0)

答案 3 :(得分:0)

我知道,这是一个我正在复兴的旧线程,但仍然想到分享这个,以便寻找类似问题的解决方案的其他人可能会受益。特别是当整个讨论没有正确的答案时。

解决方案非常简单。问题是wordpress将其处理为HTML而不是脚本,并且转换大于符号&gt;到&amp; gt。有问题的代码在/wp-includes/post-template.php中,如下所示:

function the_content($more_link_text = null, $stripteaser = false) {
$content = get_the_content($more_link_text, $stripteaser);
$content = apply_filters('the_content', $content);
/**   $content = str_replace(']]>', ']]&gt;', $content); */

您可能会注意到最后一行正在转换]]&gt;到]]&amp; gt。评论这将解决问题。