2009-10-05 5 views
3

this feed을 구문 분석하려고했습니다. 해당 링크를 클릭하면 브라우저에서 올바르게 구문 분석 할 수 없다는 것을 알 수 있습니다. (잘못 구성된 XML을 구문 분석 할 수 없습니다.

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

하지만 얻을 오류 :

어쨌든, 다음이처럼 DOM에 문자열을로드 얻을 컬를 사용하여 내 호스팅 서비스는 나를 simplexml_load_file 사용하지 않습니다, 그래서 봤는데 "DOMDocument :: loadXML (domdocument.loadxml) : 엔티티에 nbsp '엔티티가 정의되지 않았습니다.") 그런 다음 SimpleXMLElement를 사용하여 운이 좋지 않았습니다. "파서 오류 : 엔티티'nbsp '가 정의되지 않았습니다. ... 그 하나의 요소에있는 HTML 때문에).

$xml = new SimpleXMLElement($rawXML); 

그래서 내 질문은 내가 나머지 데이터를 분석 할 수 있도록, 어떻게 그 요소를 제거/무시/건너 뛸 수 있습니까?


편집 :! 솔루션에 대한 MJV하는 덕분에 ... 난 그냥

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML); 
$rawXML = str_replace('</description>',']]></description>',$rawXML); 

답변

4

당신은 각 < 설명 후

<![CDATA[ 

을 추가 사전 분석 단계를 도입해야 할 수도 있습니다> 태그
및 추가하는 각 </설명> 태그 앞에

]]> 


구체적으로 (해당 PHP 스 니펫에 대한 응답) 참조

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

'decription'요소의 전체 내용은 '이스케이프 처리'되어 있으므로이 요소에서 발견되는 모든 html (또는 xhtml) 구조가 XML 구문 분석 논리를 던질 가능성이 무시됩니다. 이것은 & nbsp; 문제뿐만 아니라 다른 많은 일반적인 문제를 언급합니다.

+0

이것은 완벽하게 작동했습니다! 감사!! – Mottie

+0

+ upvote, 내가 전에했던 생각 : –

+0

다행이었습니다. 흥미롭게도 내 반응을 확인하는 데는 어느 정도 시간이 걸렸습니다. 텍스트의 일부 "xml-like"문자를 피해야했기 때문에 SO 응답 메뉴에서 바람직하지 않은 방식으로 처리되지 않도록해야했습니다. ;-) – mjv

5

당신은 아마 소스를 조작 할 필요 해요 (같은 문제가 다른 사람을 위해) 이런 짓을 같은 뭔가 코드 :

$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); 
} 

AFAIK XML 파서에 공급하기 전에, 나는 다른 방법을 추천하고 싶지만 난이 유일한 방법이라고 생각합니다.

편집 : 나는 당신이 실제로 <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); 

당신은 문자 데이터가 들어있는 각 요소에 대해이 작업을 수행해야 할 것입니다.

+0

내가 잘못된 대체를했기 때문에 업데이트 된 솔루션 : p –

+0

그는 고마워, +1,하지만 나중에 mjv 이길 것 같아. :) – Mottie

+0

yah, 약간의 애니메이션을보기 위해 휴식을 취했다. 전부다 괜찮아. –

관련 문제