あなたの質問は本当に広いです、私が与えることができる最良の答えはあなたがあなた自身のものを書く代わりにXMLをエンコードするためにいくつかの既存のライブラリを使うべきであるということです(あなたは明らかに仕事で失敗するので、XML消費者によって報告されたXMLエンコードエラー)。
既存のライブラリを使用すると、問題を早期に指摘することもできます。例えば。次のコードでは、データベースから返されるのがUTF-8でエンコードされた文字列だけであることを確認してください。
また、最新のデータベースクライアントクラスを使用すると、コードを大幅に書き留めるのにも役立ちます。これは、 PDO
の例です。
およびDOMDocument
:
### configuration values
$config = array(
'Database' => array(
'dsn' => 'mysql:dbname=test;host=localhost;charset=utf8',
'user' => 'testuser',
'pass' => 'test',
),
'table_name' => 'config',
'table_fields' => '*',
);
### implement database access
class Database extends PDO
{
public function __construct(array $config = null)
{
$config = $config ? : $GLOBALS['config'][__CLASS__];
parent::__construct($config['dsn'], $config['user'], $config['pass']);
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
}
### setup the datasource ($rows)
$db = new Database();
$rows = $db->query("SELECT $config[table_fields] FROM $config[table_name]");
### setup the XML encoder ($doc)
$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->loadXML("<$config[table_name]s/>");
$doc->encoding = 'utf-8';
### fetch data from the datasource and encode the XML
foreach ($rows as $row) {
$child = $doc->createElement($config['table_name']);
$child = $doc->documentElement->appendChild($child);
foreach ($row as $key => $value) {
$child->appendChild($doc->createElement($key, $value));
}
}
### output XML
header("Content-Type:text/xml");
echo $doc->saveXML();
そのDomDocument
を参照してください ここでは、データベースから返されるUTF-8文字列を適切にエンコードするように注意しています。 (通常)<![CDATA[...]]>
は必要ありません もうここに。ご想像のとおり、XMLエンコーディングを壊したものをそこに置いた可能性があります。
また、データベースの相互作用についても、ほとんどのコードは必要ありません。行を反復処理するだけで、行がない場合は反復処理は行われません。これは通常、Iterator
で最もよく表現されます。 foreach
言語コンストラクトは、最新のデータベースインターフェイスによって提供される操作が可能です。技術的には、$rows
を置き換えることができます ここでは、複数のテーブルを次々に処理するイテレータなど、他の多くのものがあります。
さらに、例外エラーモードを使用すると、チェックとdie
を行う必要がなくなります。 sコードベース全体。
例示的な出力は次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<configs>
<config>
<id>1</id>
<option>value for option with ID1</option>
</config>
<config>
<id>2</id>
<option>value for option with ID2</option>
</config>
...
</configs>
それでもCDATA要素を作成する必要がある場合は、同様に機能します(ここでは、子値の代わりにCDATAセクションを追加するわずかな変更のみを含むスクリプトの一部のみを示しています):
### fetch data from the datasource and encode the XML
foreach ($rows as $row) {
$child = $doc->createElement($config['table_name']);
$child = $doc->documentElement->appendChild($child);
foreach ($row as $key => $value) {
$child->appendChild($doc->createElement($key))
->appendChild($doc->createCDATASection($value))
;
}
}
ここでも、DOMDocument
CDATAセクションの適切なエンコードを処理します。あなたがしなかった可能性が高い何か。
それでも発生する可能性のある潜在的な問題は、無効なXML名
。ただし、DOMDocument
は実際に通知するので、後でエンコードエラーが発生した場合だけでなく、XMLの生成中にもわかります。