2009-09-15 2 views
2

私は、XMLファイルを解析しようとして定義されたが、それをロードする際のSimpleXMLは、次の警告印刷されていない:問題は

警告:simplexml_load_file()[function.simplexmlロードファイル]を: gpr_545.xml:55:パーサーエラー:実体「Oslash」行にimport.phpで定義されていない35

これは、その行である:

<forenames>B&Oslash;IE</forenames><x> </x> 

それは警告であるので、私はそれを無視するかもしれませんが、私は何が起こっているのか理解したいと思います。

答えて

2

(その文字が記述する何Ø、など)のLatin1文字のHTMLエンコーディングは、XMLパーサが壊れているものです。データを管理している場合は、XML形式の文字エンコードを使用してエスケープする必要があります(Øはちょうど&#216です)

+1

ありがとう。これは実際には壊れたXMLファイルですか? – Maarten

+1

はい、許されないXMLパーサーは、非ASCII文字のXML形式のエンコーディングを期待しているときに壊れ、HTML形式のエンコーディングが代わりに使用されます。 – squeeks

+0

だから私はこれを解析しているだけです。私はBjörnの答えからテーブルを見て、それは私の最初の例のために働くが、次の問題はテーブルにないこのエンティティ:/です。より安定したソリューションはありますか? – Maarten

2

これはエンコーディングの問題だと思います。この特殊なケースではphp、simplexmlは、そのfornamesタグにあるデンマーク語のOを好きではありません。あなたはutf-8でファイル全体をエンコードしようとし、それによってタグからエスケープされたバージョンを削除することができます。あなたは完全にエスケープされた文字フリーファイルをsimplexmlに読み込むことができます。

K

+0

あなたは何を意味するかわかりません。このxmlファイルはISO-8859-1(<?xml version = "1.0" encoding = "iso-8859-1"?>)としてエンコードされています。 – Maarten

+0

右:iso-8859-1 –

+0

yeppの代わりにutf-8を使用し、テキストの実際のエンコーディングにutf8_encode()を使用します。 – KB22

3

のようなHTMLエンティティOslashはXMLエンティティと同じではありません。 Here's a table HTMLエンティティをXMLエンティティに置き換えます。

あなたのコメントから別の投稿に伝えることができるので、エンティティ/に問題があります。私もこれが有効なHTMLエンティティであるかどうかわかりませんが、私のFirefoxはエンティティ名の文字のみを表示しません。しかし、大部分のエンティティとその文字参照番号にはan other tableが見つかりました。テーブルを交換テーブルに追加してみてください。安全でなければなりません。途中で/の参照番号は/です。

+0

テーブルBjörnのためにありがとう、私のお尻を保存! – FFish

+1

最初のリンクはもう利用できませんが、2番目のリンクは正常に動作しています。 – paulroho

+0

両方のリンクが死んでいます。 – Qtax

0

このラインを使用してください:

<forenames><![CDATA[B&Oslash;IE]]></forenames><x> </x> 

をしてthis about CDATA

+0

これは私のXMLではありませんが、私はそれを解析しています。 – Maarten

+0

解析する前に、「奇妙な」文字を含むすべてのエンティティにCDATAタグを挿入する必要があります。 –

+0

このエラーが発生した場合は、有効なxmlで始まり​​ません。元の作者に修正を依頼するか、構文解析する前にこの種のチェックを行い、無効なチャンクをラップしてください。 –

1

を読むには、ただ非常に同様の問題があったし、次の方法でそれを解決しました。主な考え方は、ファイルを文字列にロードし、不正なエンティティをすべて[[entity]] Oslash;いくつかのxmlノードを表示する前に逆の置換を実行します。

function readXML($filename){ 
    $xml_string = implode("", file($filename)); 
    $xml_string = str_replace("&", "[[entity]]", $xml_string); 
    return simplexml_load_string($xml_string); 
} 
function xml2str($xml){ 
    $str = str_replace("[[entity]]", "&", (string)$xml); 
    $str = iconv("UTF-8", "WINDOWS-1251", $str); 
    return $str; 
} 
$xml = readXML($filename); 
echo xml2str($xml->forenames); 

のiconv( "UTF-8"、 "WINDOWS-1251"、$ strの)私は私のページの "WINDOWS-1251" のエンコーディングを持っているよう