输出php函数到xml。

时间:2012-02-19 11:49:55

标签: php xml

我有一个函数(在类数据库中)

            function locTo (){//return the location of the to currency
                $con = dbconnect(); //instantiate db connection
                $locationTo= mysql_query ("SELECT location  FROM Sheet1 where currency_code = '$this->to'", $con);
                $lol = mysql_fetch_array($locationTo);
                return $lol['location'];
                mysql_close();
                  }

当我调用函数

$foo = new Database($from,$to);
$hey = $foo->LocTo();
echo $hey;

 $foo = new Database($from,$to);
 echo $foo->LocTo();

它输出正确。

我试图加入XML并且我得到一个编码错误。

这是我的XML

echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<conv>';
echo'<at>'.$timefrom.'</at>';
echo'<rate>'.$rate.'</rate>';
echo'<from>';
echo'<code>'.$from.'</code>';
echo'<curr>'.$currencyFrom.'</curr>';
echo'<loc>'.$locFrom.'</loc>';
echo'<amnt>'.$amount.'</amnt>';
echo'</from>';
echo'<to>';
echo'<code>'.$to.'</code>';
echo'<curr>'.$currencyTo.'</curr>';
echo'<loc>'.$locTo.'</loc>';
echo'<amnt>'.$convertedAmount.'</amnt>';
echo'</to>';
echo'</conv>';

有谁知道为什么我会收到编码错误?我检查了源代码,它到达了位置。

这是一个放置位置的示例。

AED兑换英镑

 United Arab Emirates
 United Kingdom, Crown Dependencies (the  Isle of Man and the Channel Islands), certain      British Overseas Territories ( South Georgia and the South Sandwich Islands,  British      Antarctic Territory and  British Indian Ocean Territory)

2 个答案:

答案 0 :(得分:2)

htmlspecialchars()很可能是你的朋友,如

echo '<loc>' . htmlspecialchars($locFrom) . '</loc>';

此外,正如ZiTAL所述,header('Content-Type: text/xml, charset=utf-8')在任何输出之前是必须的。

答案 1 :(得分:2)

我建议切换到(例如)DOM,以便您的代码如下所示:

<?php

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true; // Just for presentation, don't use this in real app
$main = $dom->createElement( 'conv');
$dom->appendChild( $main);

// Generic attributes
$main->appendChild( $dom->createElement( 'at', $timefrom));
$main->appendChild( $dom->createElement( 'rate', $rate));

// Fill form
$from = $dom->createElement( 'from');
$from->appendChild( $dom->createElement( 'code', $row['from']));
$from->appendChild( $dom->createElement( 'curr', $currencyFrom));
$from->appendChild( $dom->createElement( 'loc', 'time'));
$from->appendChild( $dom->createElement( 'amnt', 'time'));
$main->appendChild( $from);

// Fill to 
$to = $dom->createElement( 'to');
$to->appendChild( $dom->createElement( 'at', 'time'));
$to->appendChild( $dom->createElement( 'code', 'time'));
$to->appendChild( $dom->createElement( 'curr', 'time'));
$to->appendChild( $dom->createElement( 'loc', 'time'));
$to->appendChild( $dom->createElement( 'amnt', '<img />'));
$main->appendChild( $to);

echo $dom->saveXML();

这应该使您的XML始终有效。结果看起来像(只填充字符串'time'):

<?xml version="1.0" encoding="UTF-8"?>
<conv>
  <at>time</at>
  <rate>time</rate>
  <from>
    <code>time</code>
    <curr>time</curr>
    <loc>time</loc>
    <amnt>time</amnt>
  </from>
  <to>
    <at>time</at>
    <code>time</code>
    <curr>time</curr>
    <loc>time</loc>
    <amnt>&lt;img /&gt;</amnt>
  </to>
</conv>

看看最后<amnt />它是否正确“xml转义”,你不必再担心了,但使用DOMELement->noveValue = html AFAIK时要小心,这不会逃避你的价值观。

当然不要忘记设置正确的header(),使用(在发送任何输出之前):

header('Content-Type: text/xml, charset=utf-8');

另请查看14.17 Content-TypeMIME types on wiki