2009-11-06 4 views
4

XML 파일의 손상된 데이터는 어떻게 처리합니까?PHP DomDocument 깨진 XML 데이터가 포함 된 XML로드

$doc = new DOMDocument(); 
$doc->validateOnParse = false; 
$doc->formatOutput = false; 
$doc->load(...xml'); 

를하고 알 수없는 실체가 있기 때문에 그것은 비참하게 실패 : 예를 들어, 나는 내가 할 노력하고있어

<text>Some &improper; text here.</text> 

했다. 소프트웨어 작성 방법으로 인해 CDATA를 사용할 수 없습니다. 나는 XML을 읽고 쓰는 모듈을 쓰고 있는데 때때로 사용자가 부적절한 텍스트를 삽입한다.

DOMDocument-> loadHTML()이 모든 것을 멋지게 인코딩했음을 알았지 만 어떻게 그곳에서 계속할 수 있습니까?

+0

loadHTML()의 문제점은 무엇입니까? 내가 아는 한, 그것은 그런 상황을 위해서 만들어진다. –

+0

"계속 거기에서 계속"한다는 것은 무엇을 의미합니까? – philfreo

+0

실제로 XML을 생성하는 소프트웨어는 심각하게 손상되어 있으므로 변경하거나 시도 할 수있는 사람에게 연락해야합니다. – ty812

답변

0

아마 당신은 당신을 위해 기관과 무거운 리프팅을 할 preg_replace_callback를 사용할 수 있습니다

http://php.net/manual/en/function.preg-replace-callback.php

function fixEntities($data) { 
    switch(substr($data, 1, strlen($data) - 2)) { 
     case 'amp': 
     case 'lt': 
     case 'gt': 
     case 'quot': // etc., etc., etc. 
      return $data; 
    } 
    return ''; 
} 
$xml = preg_replace_callback('/&([a-zA-Z0-9#]*);{1}/', 'fixEntities', $xml); 
0

xml을 쓰는 사람이라면 엔티티에 입력 한 내용을 xml에 넣기 전에 인코딩 할 수 있으므로 아무 문제가 없습니다.

1

사용 htmlspecialchars 당신의 XML/XHTML의 DOM에 입력을 밀어 전에 특별한 XML 문자를 직렬화 할 수 있습니다. 그것의 이름은 "html"접두어가 붙지 만 대체되는 유일한 문자에 기반하여 xml 데이터 직렬화에 진정으로 유용합니다.

관련 문제