質問

私は解析しようとしています このフィード. 。そのリンクをクリックすると、ブラウザで正しく解析できないことがわかります。

とにかく、私のホスティングサービスではSimplexml_load_fileを使用することはできませんので、Curlを使用してそれを取得してから、このように文字列をDOMにロードしています。

$dom = new DOMDocument;
$dom->loadXML($rawXML);
if (!$dom) {
 echo 'Error while parsing the document';
 exit;
}
$xml = simplexml_import_dom($dom);

しかし、エラー( "domdocument :: loadxml()[domdocument.loadxml]:エンティティ 'nbsp'エンティティで定義されていない")を取得し、運がないsimplexmlementを使用してみました(同じエラーを表示します "パーサーエラー:エンティティ 'nbsp' '定義されていない」など...その1つの要素のHTMLのため)。

$xml = new SimpleXMLElement($rawXML);

それで、私の質問は、その要素をスキップ/無視/削除して、残りのデータを解析できるようにするにはどうすればよいですか?


編集:ソリューションをMJVに感謝します!...私はこれをしました(同じ問題がある他の人のために)

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);
役に立ちましたか?

解決

追加する前の順位ステップを導入する必要があるかもしれません

<![CDATA[

それぞれの後u003Cdescription>鬼ごっこ
そして追加します

]]>

それぞれの前u003C/description>鬼ごっこ
具体的には、対応するPHPスニペットについてはMederの応答を参照)

<description>blah <br />&nbsp; blah, blah...</description>
should become
<description><![CDATA[blah <br />&nbsp; blah, blah...]]></description>

この方法では、「Decription」要素の完全な内容は「脱出」されるため、この要素に含まれており、XML解析ロジックを投げるHTML(またはXHTML)構成は無視されます。これは、あなたが言及した問題だけでなく、他の多くの一般的な問題にも対処します。

他のヒント

おそらく、次のようなものでソースコードを操作する必要があります。

$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
if ( $xml ) {
    $xml = preg_replace( '/&nbsp/', '&amp;nbsp', $xml );
    $xml = new SimpleXMLElement($xml);
    var_dump($xml);
}

XMLパーサーAfaikに供給する前に、他の方法をお勧めしたいと思いますが、これが唯一の方法だと思います。

編集:実際に交換できると思います <description><description><![CDATA[ など:

<?php
$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
$xml = preg_replace( '/<description>/', '<description><![CDATA[', $xml );
$xml = preg_replace( '/<\/description>/', ']]></description>', $xml );
$xml = new SimpleXMLElement($xml);
var_dump($xml);

文字データを含む各要素に対してこれを行う必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top