"&" が含まれるデータベースに保存されている xml ドキュメントを読み込もうとすると、エラーが発生するように見える不適切に作成された Web アプリケーションを継承しました。たとえば、「プリペイド & チャージ」という内容のタグがあります。その文字の解析中にエラーが発生しないようにするための秘密の簡単なことはありますか、それとも明らかな何かが欠けていますか?
編集:整形式でないためにこの同じタイプのパーサーエラーを引き起こす他の文字はありますか?
"&" が含まれるデータベースに保存されている xml ドキュメントを読み込もうとすると、エラーが発生するように見える不適切に作成された Web アプリケーションを継承しました。たとえば、「プリペイド & チャージ」という内容のタグがあります。その文字の解析中にエラーが発生しないようにするための秘密の簡単なことはありますか、それとも明らかな何かが欠けていますか?
編集:整形式でないためにこの同じタイプのパーサーエラーを引き起こす他の文字はありますか?
問題は、xml の形式が正しくないことです。適切に生成された xml は、次のようなデータをリストします。
Prepaid & Charge
以前に同じ問題を修正する必要がありましたが、次の正規表現で修正しました。
Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)");
それを次のように定義された文字列定数と組み合わせます。
const string goodAmpersand = "&";
今、あなたはただ言うことができますbadAmpersand.Replace(<your input>, goodAmpersand);
String.Replace("&", "&")
特定のドキュメントについて、同じドキュメント内で & 文字が正しくコーディングされるか、正しくコーディングされないか、またはその両方がコーディングされるかを前もって知ることはできないため 、単純では不十分であることに注意してください。
ここでの問題は、xml ドキュメントをパーサーにロードする前に、xml ドキュメントに対してこれを行う必要があることです。また、CDATA セクション内のアンパサンドも考慮されません。最後に、アンパサンドのみをキャッチし、< などの他の不正な文字はキャッチしません。 更新:コメントに基づいて、16 進コード (&#x...;) エンティティの式も更新する必要があります。
どのキャラクターが問題を引き起こす可能性があるかについては、実際のルールは少し複雑です。たとえば、データでは特定の文字を使用できますが、要素名の最初の文字としては使用できません。そして、不正な文字の単純なリストはありません。代わりに、UNICODE の大規模な (連続していない) 部分は合法と定義され、それ以外のものはすべて違法です。
したがって、最終的には、ドキュメント ソースが少なくとも一定のコンプライアンスと一貫性を備えていることを信頼する必要があります。たとえば、& が許可されていないことを知らなくても、タグが適切に機能し、< をエスケープするのに十分なほど賢い人が多いことがわかったので、今日の問題です。ただし、最善の方法は、これをソースで修正することです。
ああ、CDATA の提案に関するメモ:作成している xmlが適切な形式であることを確認するためにそれを使用しますが、外部から既存の xml を処理する場合は、正規表現メソッドの方が簡単です。
他の答えはすべて正しいです。私は彼らのアドバイスに同意しますが、1つだけ追加させてください。
整形式でない XML で動作するアプリケーションを作成しないでください。それは、私たちの残りの生活をより困難にするだけです :)。
確かに、反対側を制御できない場合、本当に選択肢がない場合がありますが、致命的なエラーをスローし、そのようなイベントが発生したときに何が壊れているかについて非常に大声で明示的に不平を言う必要があります。 .
さらに一歩進んで、「この XML はいくつかの場所で壊れています。これらの理由から、整形式にするために修正を試みた方法は次のとおりです: ...」と言うことができます。
私は MSXML API にあまり詳しくありませんが、ほとんどの優れた XML パーサーでは、エラー ハンドラーをインストールできるため、エラーが発生している正確な行/列番号をトラップし、エラー コードとメッセージを取得できます。
Web アプリケーションに問題があるのではなく、XML ドキュメントに問題があります。XML のアンパサンドは としてエンコードする必要があります&
。そうしないと、構文エラーになります。
編集:フォローアップの質問への回答では、はい、あらゆる種類の同様のエラーがあります。たとえば、バランスのとれていないタグ、エンコードされていない小なり記号、引用符で囲まれていない属性値、文字エンコード外のオクテット、さまざまな Unicode の奇妙さ、認識されないエンティティ参照などがあります。適切な XML パーサーでドキュメントを使用するには、そのドキュメントが適切な形式である必要があります。XML 仕様では、不正な形式のドキュメントに遭遇したパーサーは致命的なエラーをスローする必要があります。
データベースに XML ドキュメントが含まれていません。これには、整形式の XML ドキュメントと、人間には XML のように見える文字列が含まれています。
可能であれば、これを修正する必要があります。特に、不正な形式の XML ドキュメントを生成しているプロセスを修正する必要があります。このデータベースからデータを読み取るプログラムを修正することは、壁の亀裂に壁紙を張るだけです。
& を置き換えることができます&
または、 CDATAセクションを使用することもできます。
XML データの形式が正しくないと報告される原因となる文字がいくつかあります。
w3schoolsより:
「<」や「&」などの文字は、XML 要素では使用できません。
XML 準拠であると信頼できない入力に対する最善の解決策は、CDATA タグでラップすることです。
<![CDATA[This is my wonderful & great user text]]>
<![CDATA[
および]]>
タグ内のすべてがパーサーによって無視されます。