2016-06-12 5 views
0

나는 다음과 같은 코드를 실행하려고하면 큰 XML 파일을 처리하는 XMLReader를 사용을 시작하기 위해 노력하고있어,하지만 난 이상한 HTTP 400 잘못된 요청을 얻고있다 :PHP의 XMLReader 400 잘못된 요청

<?php 
$reader = new XMLReader(); 
$reader->open ("testfile.xml"); 
while ($reader->read()) { 
    switch ($reader->nodeType) { 
     case (XMLREADER::ELEMENT) : 
      echo "&lt;" . $reader->name . "&gt; <br>"; 
      break; 
     case (XMLREADER::TEXT) : 
      if ($reader->hasValue) { 
       echo $reader->value . "<br>"; 
      } 
      break; 
    } 
} 
$reader->close(); 
?> 

I을 또한이 방법을 시도하고 같은 400 잘못된 요청 오류 얻을 수있다 : 두 경우 모두

<?php 
$reader = new XMLReader(); 
$reader->open ("testfile.xml"); 
while ($reader->read()) { 
    switch ($reader->nodeType) { 
     case (XMLREADER::ELEMENT) : 
      echo "&lt;" . $reader->name . "&gt; <br>"; 
      $reader->read(); 
      if (($reader->nodeType == XMLREADER::TEXT) && $reader->hasValue) { 
       echo $reader->value . "<br>"; 
      } 
      break; 
    } 
} 
$reader->close(); 
?> 

을, 오류가 나는 echo reader->value ."<br>";을 주석 때 사라집니다. Apache 오류 로그에 아무것도 표시되지 않습니다. 또한 400 오류가 발생하더라도 페이지는 요소 및 텍스트 값으로 예상대로 작성되고 렌더링됩니다 (즉, 코드가 작동하는 것처럼 보일뿐 HTTP 오류도 표시됨).

텍스트가있는 루트 요소 하나와 자식 요소 하나만있는 작고 간단한 테스트 XML 파일에서 오류없이 작동하는 것처럼 보입니다. 실제로 처리하려고하는 더 복잡한 XML 파일에서만 오류가 발생합니다.

미리 도움을 청하십시오!

답변

0

참고 다른 사람이이 문제를 겪는 경우에 대비하여 htmlspecialchars()을 사용하여 값을 이스케이프해야한다는 것을 알았습니다. 나는 변경 :

echo $reader->value . "<br>"; 

추측

echo htmlspecialchars($reader->value, ENT_XML1, 'UTF-8') . "<br>"; 

에 브라우저가 400 오류를 일으키는 해석하려고 한 XML의 일부 HTML이 있어야합니다.