2015-01-10 4 views
3

PHP 5.3.9 버전을 사용하고 있습니다. XML 파일을 파싱 할 때 CDATA 섹션의 줄 끝 문자를 변경하기 때문에 SimpleXML을 사용하는 데 문제가 있습니다.PHP SimpleXML은 CDATA 요소에서 줄 바꿈 문자를 수정합니다.

예를 들어

:

$string = "<value><![CDATA[hello\r\nworld]]></value>"; 

$xml = simplexml_load_string($string); 
var_dump((string)$xml); 

var_dump("hello\r\nworld"); 

출력 :

string(11) "hello world" 
string(12) "hello world" 

에도 즉시 "는 SimpleXML이 버전은 윈도우에서 줄 바꿈을 변화 분석 볼 수있는 16 진수 값 보지 않고 \ 연구 \ n "유닉스로 개행"\ n "문자열 길이의 개행 문자. 이것은 XML 파일에 serialize() ed 객체를 저장하려고하기 때문에 문제입니다. 그러나 serialize()은 개행 문자를 포함하여 직렬화하는 모든 문자열의 정확한 길이를 저장합니다. unserialize() 문자열을 XML에서 읽은 후 문자열 길이가 바뀌었기 때문에 문자열 길이가 더 이상 올바르지 않아 올바르게 끝내지 못했습니다. 이 문제를 해결하려면 "\ r \ n"을 "\ n"으로 바꾸려면 모든 입력 문자열을 위생적으로 처리해야하지만 이것이 필요한 작업이 아닌 것 같습니다.

나는 XML 파서가 어떤 식 으로든 CDATA 요소의 내용을 구문 분석하지 않아야한다는 인상하에있었습니다. 어떻게 CDATA 섹션을 지정했는지 오해하니, 어떻게 든 SimpleXML을 오용하고 있습니까? 아니면 SimpleXML의 버그입니까?

답변

-2

나는 당신의 요점을 찾지 못했습니다.

하지만 큰 따옴표를 사용했음을 유의하십시오. 내 변형에

:

$string = '<value><![CDATA[hello\r\nworld]]></value>'; 

$xml = simplexml_load_string($string); 
var_dump($xml->__toString()); 
var_dump((string)$xml); 

$xml = new SimpleXMLElement($string); 
var_dump($xml->__toString()); 

var_dump('hello\r\nworld'); 

출력

string(14) "hello\r\nworld" 
string(14) "hello\r\nworld" 
string(14) "hello\r\nworld" 
string(14) "hello\r\nworld" 

하지만 기대는 무엇인가? 그게 뭔지 말해 줄래?

+0

PHP에 얼마나 익숙한 지 잘 모르겠지만 PHP에서는 [이스케이프 문자를 사용하려면 큰 따옴표를 사용해야합니다.] (http://php.net/manual/en/language.types.string. php # language.types.string.syntax.double). 내 질문에 SimpleXML 이스케이프 된 \ r (캐리지 리턴) 및 \ n (줄 바꿈) 문자를 두 문자에서 단일 \ n 문자로 변경하는 것에 대해 묻습니다. 귀하의 예제에서 문자열은 완전히 다른 4 개의 문자 "\ r \ n"을 가지고 있습니다. – zookatron

+0

죄송하지만 문제가있는 부분에 대해서는 약간 잘못되었습니다. :-) 문제는 데이터가있는 원래 문자열입니다. 그래서 나는 간단한 XML로 무언가를 바꾸지 않았다. 방금 소스 문자열을 더 정확하게 준비했습니다. 즉, 이상한 SimpleXML 동작이 아니라 xml에 보내는 잘못된 소스 데이터 문자열이 문제의 원인임을 의미합니다. – Alex

+0

원본 소스 문자열에 정확히 "잘못"된 것은 무엇입니까? 줄 바꿈 및 캐리지 리턴 문자는 XML에서 유효하지 않습니다. 입력 문자열이 잘못된 XML 인 적절한 이유가 없다면 "그냥 입력 문자열 변경"이라고 말하면 완전히 무시됩니다. – zookatron