2010-05-17 3 views
2

여기에 무슨 일이 일어날까요?PHP simplexml 엔티티

$string = <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
    <album> 
     <img src="002.jpg" caption="w&aacute;ssup?" /> 
    </album> 
XML; 

$xml = simplexml_load_string($string); 
// $xmlobj = simplexml_load_file("xml.xml"); // same thing 

echo "<pre>"; 
var_dump($xml); 
echo "</pre>"; 

오류 :

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 5: parser error : Entity 'aacute' not defined

답변

14

&aacuteXML entity하지 않습니다 - 당신은 HTML에 대해 생각하고 있습니다. - XML에 "있는 그대로"

특수 문자는 일반적으로 사용되는 입력 데이터에 html_entity_decode() 트릭해야한다 (UTF-8 문자 집합으로 지정하는 것을 잊지 마세요) :

$string = html_entity_decode($string, ENT_QUOTES, "utf-8"); 
+0

페카, 내 예제에서 내가 할 경우 : $ xmlStr = file_get_contents ("xml.xml"); $ xml = html_entity_decode ($ xmlStr, ENT_QUOTES); 캡션 = "w ssup?" – FFish

+0

@ffish 'utf-8'을 추가 했습니까? –

+0

아니, 나는하지 않았다! 몇 분 안에 많은 정보를 입력하십시오. 그것은 이제 작동합니다 :-) – FFish

2

를 내가 며칠 전이 문제가있었습니다. & 임의 발생이 실패하는 파서를 유지하는 CDATA 태그

<album> 
    <img src="002.jpg" /> 
    <caption><![CDATA[now you can put whatever characters you need & include html]]></caption> 
</album> 

안에 있어야한다.

+0

을 참조하십시오. 'img' 태그가 HTML로 남아 있어야한다면 좋은 지적입니다. OP가 원하는 것에 따라 엔티티가 디코딩되거나 디코딩됩니다. –

+0

그래,하지만 CDATA를 사용할 수 없으므로 XML 파일은 이렇게되어야합니다. 속성에 캡션이 있습니다. Pekka, 어떻게 엔티티를 디코딩 할 수 있습니까? file_get_contents()로 XML 문자열을 가져와야하고 디코드해야하는 XML 문자열을 가져야합니까? – FFish

2

대체 방법으로 Matt Robinson's article을보고 싶을 수도 있습니다 : 에서 명명 된 엔티티를 숫자로 변환 중입니다. 스크립트가 다소 복잡 찾아내는 경우에 당신은 또한 하나 shared on SourceRally을 사용할 수 있습니다, 또한

There are two possible problems with this approach. The first is invalid entities: html_entity_decode() won't touch them, which means you'll still get XML errors. The second is encoding. I suppose it's possible that you don't actually want UTF-8 . You should, because it's awesome, but maybe you have a good reason. If you don't tell html_entity_decode() to use UTF-8 , it won't convert entities that don't exist in the character set you specify. If you tell it to output in UTF-8 and then use something like iconv() to convert it, then you'll lose any characters that aren't in the output encoding.

: 그것은 (이미 다른 대답에 의해 지적)을 html_entity_decode 방법과 몇 가지 잠재적 인 함정을 언급하고있다.

+0

하지만 데이터를 가져 오는 방법은 무엇입니까? file_get_contents()를 사용 하시겠습니까? – FFish

+0

$ feed = file_get_contents ('xml.xml'); // 파서가 barf를 사용하지 않도록 문자열에 필요한 모든 작업을 수행하십시오. $ xmlObj = simplexml_load_string ($ feed); –

1

또 다른 해결책은

"w&aacute;ssup?" to "w&amp;aacute;ssup?"

0

이이 FUNC 시도 변경하는 것입니다 simplexml_load_entity_string

<?php 

$string = <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
    <album> 
     <img src="002.jpg" caption="test&lt;w&aacute;ssup?" /> 
    </album> 
XML; 

$xml = simplexml_load_entity_string($string); 

var_dump($xml); 

function simplexml_load_entity_string($string = '') 
{ 
    // cover entity except Predefined entities in XML 
    $string = str_replace([ 
     '&quot;', '&amp;', '&apos;', '&lt;', '&gt;', 
    ], [ 
     'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK', 
    ], $string); 
    $string = html_entity_decode($string, ENT_QUOTES, "utf-8"); 
    $string = str_replace([ 
     'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK', 
    ], [ 
     '&quot;', '&amp;', '&apos;', '&lt;', '&gt;', 
    ], $string); 

    // load xml 
    return simplexml_load_string($string); 
}