12

他の場所からXMLファイルを検索して処理し、それらをいくつかのXSLTで変換する必要があります。問題ない。PHP5とDOMライブラリを使用すると、すべてが簡単になります。今まではうまくいきました。今日、ファンキーな文字がXMLファイルに含まれていました。Wordからの「スマート」な引用です。とにかく、DOMDocument-> loadはそれらについて不平を言い、それらはUTF-8ではないと言って、エンコーディングを指定しました。

見よ、これらのXMLファイルではエンコーディングが指定されていません。'encoding = "iso-8859-1"'をヘッダーに追加すると、正常に機能します。摩擦は、私がこれらのXMLファイルを制御できないことです。

ファイルを文字列に読み込み、ヘッダーを変更して別の場所に書き戻すのが私の唯一の選択肢のようですが、XMLファイルの一時的なコピーをまったく使用せずにそれを実行したいと思います。それらがiso-8859-1であるかのようにそれらを解析するようにパーサーに単純に指示する方法はありますか?

4

3 に答える 3

10

これはあなたのために働きますか?

$doc = new DOMDocument('1.0', 'iso-8859-1');
$doc->load($xmlPath);

編集:これは機能しないように見えるので、代わりにできることは既存の方法と似ていますが、一時ファイルがありません。標準のIO操作(または何か)を使用してソースからXMLファイルを読み取り、file_get_contents()必要なエンコーディング(iconv()またはutf8_decode())に変更を加えてから、loadXML()

$myXMLString = file_get_contents($xmlPath);
$myXMLString = utf8_decode($myXMLString);
$doc = new DOMDocument('1.0', 'iso-8859-1');
$doc->loadXML($myXMLString);
于 2009-08-13T00:48:30.270 に答える
5

デフォルトのエンコーディングを設定する方法は(まだ)見つかりませんが、この場合はリカバリモードが実行可能かもしれません。
libxmlでエンコードエラーが発生し、エンコードが明示的に設定されていない場合、libxmlはunicode / utf8からlatin1に切り替わり、ドキュメントの解析を続行します。ただし、パーサーコンテキストでは、プロパティwellFormedは0/falseに設定されます。wellFormedPHPのDOM拡張機能は、 trueまたはDOMDocumentオブジェクトの属性がtrueの場合、ドキュメントを有効と見なしrecoverます。

<?php
// german Umlaut ä in latin1 = 0xE4
$xml = '<foo>'.chr(0xE4).'</foo>';

$doc = new DOMDocument;
$b = $doc->loadxml($xml);
echo 'with doc->recover=false(default) : ', ($b) ? 'success':'failed', "\n";

$doc = new DOMDocument;
$doc->recover = true;
$b = $doc->loadxml($xml);
echo 'with doc->recover=true : ', ($b) ? 'success':'failed', "\n";

プリント

Warning: DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE4 0x3C 0x2F 0x66 in Entity, line: 1 in test.php on line 6
with doc->recover=false(default) : failed

Warning: DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE4 0x3C 0x2F 0x66 in Entity, line: 1 in  test.php on line 11
with doc->recover=true : success

警告メッセージ(@ $ doc-> load()で抑制できます)が表示され、内部libxmlエラーにも表示されます(パーサーがutf8からlatin1に切り替わるときに1回だけ)。この特定のエラーのエラーコードは9(XML_ERR_INVALID_CHAR)になります。

<?php
$xml = sprintf('<foo>
    <ae>%s</ae>
    <oe>%s</oe>
    &
</foo>', chr(0xE4),chr(0xF6));

libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->recover = true;
libxml_clear_errors();
$b = $doc->loadxml($xml);
$invalidCharFound = false;
foreach(libxml_get_errors() as $error) {
    if ( 9==$error->code && !$invalidCharFound ) {
        $invalidCharFound = true;
        echo "found invalid char, possibly harmless\n";
    }
    else {
        echo "hm, that's probably more severe: ", $error->message, "\n";
    }
}
于 2009-08-13T13:48:44.917 に答える
2

エンコーディングを指定する唯一の方法は、ファイルの先頭にある XML 宣言です。

<?xml version="1.0" encoding="ISO-8859-1"?>
于 2013-11-26T13:43:23.223 に答える