FC2ブログ
--------(--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2008-01-29(Tue)

PHPでのXML処理(attributeの値が日本語(UTF-8))

XMLWriterを使用したが、<ほげほげ>内のattributeの値が日本語(UTF-8)だとデコードされて出力されてしまう。

例)
<message Attribute1="text_1"Attribute2="&#x65E5;&#x672C;&#x8A9E;">データ2</message>

ブラウザで見る分には問題ないので放置していたが、担当者はエディッタで内容確認が出来ないと嫌らしい。
#DBからデータを取ってきているので内容がおかしいのはDB登録の時点で発生するんだけどね~。
#そもそもブラウザに表示されるものなので、エディッタで確認ってのがわからない。

大体がxmlファイルの設計が悪いと思うんだけど、、、
Attributeにエラーメッセージを書くようにするなんてさ。
XMLパーサーでIDを渡して、取得しずらいじゃん。

批判しても権力がないので、長いものに巻かれることにして実験しました。

1.Simple XML で作成し、DOMでWriteしてみる。
Attribute内でもデコードされないで日本語が出力されましたが、出力後のXMLファイルがうまく整形されないので駄目。

2.DOMで作成し、DOMでWriteする。
これだとメモリーは食うが、デコードされないで日本語が出力され、整形もOK.
但し、XMLWriterの様に、indentが設定できないので、indentは半角空白になります。

下記に実験コードを示す。


<?php
//
// DOMで作成し、DOMでWriteする
//

$dom = new DOMDocument('1.0', 'UTF-8');
// 出力はきれいに整形したいですね。
$dom->formatOutput = true;

// root node
$node_root = $dom->appendChild(new DOMElement('root'));

// table node
$node_table = $node_root->appendChild(new DOMElement('table'));

// name node
$node_name = $node_table->appendChild(new DOMElement('name', 'Default'));

// message node
$element_msg = $node_table->appendChild(new DOMElement('message'));
$attr = $element_msg->setAttribute('id', 'CEF0001');
$attr = $element_msg->setAttribute('message', 'MessageXMLにデータが存在しません。[エラー発生コード=%s]');
$dom->save("test4.xml");

?>


以上。
  1. 無料アクセス解析


スポンサーサイト
2007-11-06(Tue)

PHP 5.1以降 XMLWriter

今更ですが、、、
初めて、PHP使うことになりました。

で、最初はDBの内容をxmlファイル出力し、ftpsで複数のwebサーバーに配信する。というバッチの作成。

PHPのマニュアルを見て、簡単そうなXMLWriterでやってみる事に。

簡単なサンプル。





$xml = new XMLWriter();

$xml->openMemory(); // echoで表示したい場合
//$xml->openUri('./test.xml'); //ファイルに書く場合

$xml->setIndent(1);
$xml->setIndentString(' ');

$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('root');

$xml->startElement('second');
$xml->startAttribute('Attribute1');
$xml->text('text_1');
$xml->endAttribute();

$xml->startAttribute('Attribute2');
$xml->text('text_2');
$xml->endAttribute();

$xml->text('data_1');
$xml->endElement();

$xml->writeElement('aaa', 'aaa_value');
$xml->endElement();

echo $xml->outputMemory(true);
//$xml->endDocument(); //ファイルに書く場合
?>



結果



a_value




まぁ、最初わかりやすしようと、エレメント名に漢字を使ったり、数字から始めたりしたりして、

Warning: XMLWriter::startElement(): Invalid Element Name in ほげほげ

とか怒られちゃいましたがw。


うまく行って何よりです。

P.S.
XMLReader 拡張モジュールは、PHP 5.0.0 では PECL から取得可能です。 また、PHP 5.1.0 ではデフォルトで組み込まれ、有効になっています。
(追記:php -mで確認できる)
configure 時に、引数 --enable-xmlreader (5.1.0 より前では --with-xmlreader) を指定することでも有効にできます。
libxml 拡張モジュールが必要です。

だそうです。

以上。
  1. 無料アクセス解析
プロフィール

lidelu

Author:lidelu
FC2ブログへようこそ!

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。