1

TEXTDATA に文字 & < および > を含む XML 文字列を解析しようとしています。通常、これらの文字は html エンコードする必要がありますが、私の場合はエンコードされていないため、次のメッセージが表示されます。

警告: DOMDocument::loadXML() [function.loadXML]: エンティティの属性名の解析中にエラーが発生しました... 警告: DOMDocument::loadXML() [function.loadXML]: 開始タグの末尾が見つかりませんでした ...

str_replace を使用してすべての & をエンコードできますが、それを < または > で行うと、有効な XML タグに対してもそれを行うことになります。

この問題の回避策を知っている人はいますか??

ありがとうございました!

4

4 に答える 4

5

XML のテキスト内に < がある場合...それは有効な XML ではありません。エンコードするか、<![CDATA[.

それが不可能な場合 (この「XML」を出力していないため)、いくつかの Html 解析ライブラリを試してみることをお勧めします (私はそれらを使用しませんでしたが、それらは存在します)。それらは XML のものよりも厳密ではないからです。

しかし、他のことを試す前に、有効な XML を取得しようとします!!

于 2010-01-12T14:03:36.290 に答える
3

DomDocument の load() の呼び出しの前によく使用@します。これは主に、何をロードするかが期待どおりかどうかを絶対に確信できないためです。

を使用@すると、エラーが抑制されます。

@$dom->loadXml($myXml);
于 2010-01-12T14:03:09.170 に答える
1

str_replace を使用してすべての & をエンコードできますが、それを < または > で行うと、有効な XML タグに対してもそれを行うことになります。

厳密に一時的な修正手段として、タグまたはエンティティ参照のように見えるものの一部ではないものを置き換えることができます。

$str= preg_replace('<(?![a-zA-Z_!?])', '&lt;', $str);
$str= preg_replace('&(?!([a-zA-Z]+|#[0-9]+|#x[0-9a-fA-F]+);)', '&amp;', $str);

ただし、これは完璧ではありません。長期的には、この偽のマークアップを生成しているものを修正するか、手がかりが得られるまで修正が必要な人に叫ぶ必要があります。このような非常に整形式でない XMLは、定義上、単純に XMLではありません。

于 2010-01-12T14:18:25.600 に答える
0

すべてのテキストを CDATA 要素内に配置しますか?

<!-- Old -->
<blah>
    x & y < 3
</blah>

<!-- New -->
<blah><![CDATA[
    x & y < 3
]]></blah>
于 2010-01-12T14:04:13.277 に答える