php - 開始 - XMLパーサーエラー:エンティティが定義されていません




開始 タグ 終了 タグ 対応 し てい ませ ん (4)

1 。 私はすべての[   ?]とスワップアウト[   ?]または実際のスペース。

これは堅牢な方法ですが、すべてのHTMLエンティティのテーブルを用意する必要があります(貼り付けられた入力がHTMLから来ていると仮定します)。また、エンティティ参照の貼り付けテキストを解析する必要があります。

2 。 問題のコードをCDATAセクションに入れることができます。

つまり、セクション全体の解析を無効にしますか? それから、別の方法で解析する必要があります。 仕事ができました。

3 。 これらのエンティティをXMLファイルに含めることができます。

エンティティ定義を含めることを意味しますか? XMLファイルをかなり大きくしても大丈夫であれば、これは簡単で頑丈な方法だと思います。 外部エンティティである「インクルード」ファイル(Web上にあるものを含む)をメインのXMLファイルの先頭から参照することができます。

1つの欠点は、使用しているXMLパーサーが外部エンティティを処理する(すべてのパーサーに必要なわけではありません)必要があることです。 また、外部エンティティのURL(場合によっては相対URL)をアクセス可能なものに正しく解決する必要があります。 これはそれほど悪くはありませんが、処理ツールの制約が増えることがあります。

4 。 貼り付けられたコンテンツで非XMLを禁止することができます。 とりわけ、これは、XML(Tomalakが述べたもの)であらかじめ定義されていないか、コンテンツ自体で定義されているエンティティ参照を許可しません。 ただし、ユーザーがHTMLを貼り付ける必要がある場合は、アプリケーションの要件に違反する可能性があります。

5 。 someDiv.innerHTML = thePastedContentを設定すると、貼り付けられたコンテンツをHTMLとしてDOMツリーに解析できます。 言い換えれば、どこかでdivを作成してください(おそらくdisplay = none、デバッグを除いて)。 このdiv要素を保持するjavascript変数myDivと、入力テキストフィールドである要素を保持する別の変数myFieldがあるとします。 その後、JavaScriptで行う

myDiv.innerHTML = myField.value;

未処理のテキストをmyFieldから取り出し、HTML DOMツリーに解析し、HTMLコンテンツとしてmyDivに貼り付けます。

次にDOMツリーをXMLにシリアライズする(= "逆解析"する)ブラウザベースのメソッドを使用します。 たとえば、 この質問を参照してください。 次に、結果をXMLとしてサーバーに送信します。

ブラウザやサーバーでこの修正を行うかどうか(@Hannesが示唆しているように)は、データのサイズ、応答の速さ、サーバーの動作状況、ハッカーの送信を気にするかどうかによって異なります意図しないXMLを作成します。

私はこの問題のstackoverflowを検索し、いくつかのトピックを見つけましたが、私は本当にこれに私のための確かな答えではないように感じる。

ユーザーが送信するフォームがあり、フィールドの値はXMLファイルに保存されています。 XMLはUTF-8でエンコードされるように設定されています。

いつでも、ユーザはどこかからテキストをコピー/ペーストし、それが「エンティティが定義されていないエラー」を受け取ったときです。

私はXMLが選択された少数のエンティティのみをサポートしていることを認識しています。それ以外のものは認識されません。パーサーエラーです。

私が集めたものから、私が見たいくつかの選択肢があります:

  1. 私はすべての   でスワップアウトし  または実際のスペース。
  2. 問題のコードをCDATAセクションに入れることができます。
  3. これらのエンティティをXMLファイルに含めることができます。

私がXMLファイルでやっていることは、ユーザーがフォームにコンテンツを入力し、XMLファイルに格納され、そのコンテンツがXHTMLとしてWebページ(SimpleXMLで解析済み)として表示されるということです。

3つのオプション、または私が気づいていないその他のオプションのうち、本当にこれらのエンティティを扱う最良の方法は何ですか?

ありがとう、ライアン

更新

皆様に感謝したいと思います。 私は実際にエンティティエラーの原因を突き止めました。 すべての提案は私にそれをより深く見させました!

いくつかのテキストボックスは普通のテキストボックスですが、私のテキストエリアはTinyMCEで拡張されています。 PHPの警告では、TinyMCEの拡張テキストエリアからのデータを常に参照していたことが判明しました。 後で私はすべての文字が(それを読むことができなかったために)取り出されたPCに気づいたが、MACではその文字のユニコード番号を参照する小さな正方形のボックスを見ることができた。 私がutf8_encodeを使って他の解析エラー(何とかTinyMCEにも関係している)を防ぐためにUTFではないデータをエンコードしていたからです。

このすべてへの解決策は非常に簡単でした:

私は、この行entity_encoding : "utf-8"を私のtinyMCE.initに追加しました。 さて、すべてのキャラクターは、彼らが想定しているように表示されます。

私は理解できないのは、何もテキストボックスに置かれたときに文字が表示される理由です。何もUTFに変換しないためですが、TinyMCEでは問題になりました。


この質問は、XMLやJSON(つまり、基本的にすべての言語)を解析するすべての言語の一般的な問題です。

上記の答えはPHPのためのものですが、Perlのソリューションは簡単です...

my $excluderegex =
    '^\n\x20-\x20' .   # Don't Encode Spaces
       '\x30-\x39' .   # Don't Encode Numbers
       '\x41-\x5a' .   # Don't Encode Capitalized Letters
       '\x61-\x7a' ;   # Don't Encode Lowercase Letters

    # in case anything is already encoded
$value = HTML::Entities::decode_entities($value);

    # encode properly to numeric
$value = HTML::Entities::encode_numeric($value, $excluderegex);

テキストをHTMLで解析して、それぞれの数値エンティティのみでエスケープすることができます(例:    )。 いずれにしても、単純に消毒されていないユーザー入力を使用するのは悪い考えです。

すべての数値エンティティはXMLで許可されていますが、HTMLから認識された名前付きのエンティティのみが機能しません( & "<>'除く)。

しかし、ほとんどの場合、実際の文字( öö )をXMLファイルに書き込むだけで、エンティティ参照をまったく使用する必要はありません。 XMLを操作するためにDOM APIを使用している場合(これは必須です)、これが最も安全な方法です。

最後に(これは怠惰な開発者の解決策です)、壊れたXMLファイルを作成することができます(つまり、エンティティエラーが発生していない整形式ではありません)。 これはうまくいくかどうかによってはうまくいくかもしれないし、失敗するかもしれません。 私の経験では、きちんとしたものはかなりスマートですが、あなたはたくさん離れていくことができます。


私はそれが純粋にエンコードの問題であることに同意します。 PHPでは、これが私がこの問題をどのように解決したかです:

  1. html-fragmentをSimpleXMLElementコンストラクタに渡す前に、 html_entity_decodeを使用してhtml-fragmentをデコードしhtml_entity_decode

  2. 次に、 utf8_encode()を使用してそれをさらにエンコードします。

$headerDoc = '<temp>' . utf8_encode(html_entity_decode($headerFragment)) . '</temp>'; 
$xmlHeader = new SimpleXMLElement($headerDoc);

上記のコードでは、 未定義のエンティティエラーは発生しません。







simplexml