[php] xml을 PHP 파일에로드하는 동안 ‘xmlParseEntityRef : 이름 없음’경고가 표시됨
을 사용하여 PHP에서 xml을 읽고 simplexml_load_file
있습니다. 그러나 xml을로드하는 동안 경고 목록이 표시됩니다.
Warning: simplexml_load_file() [function.simplexml-load-file]: <project orderno="6" campaign_name="International Relief & Development" project in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ional Relief & Development" project_id="313" client_name="International Relief & in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3
이러한 경고를 제거하려면 어떻게해야합니까?
(XML은 URL에서 생성되고 http://..../index.php/site/projects
test.php의 변수에로드됩니다. index.php에 대한 쓰기 권한이 없습니다.)
답변
XML은 대부분 유효하지 않습니다.
문제는 “&”일 수 있습니다.
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
“&”를 제거하고 HTML 코드 버전으로 대체합니다. 시도해보십시오.
답변
문제점 : XML 구문 분석기가 “xmlParseEntityRef : noname”오류를 리턴합니다.
원인 : XML 텍스트 어딘가에 ‘&'(앰퍼샌드 문자)가 있습니다. 일부 텍스트 및 추가 텍스트
해결책:
- 해결 방법 1 : 앰퍼샌드를 제거합니다.
- 해결 방법 2 : 앰퍼샌드를 인코딩합니다 (즉,
&
문자 를로 대체&
). XML 텍스트를 읽을 때 디코딩해야합니다.- 솔루션 3 : CDATA 섹션을 사용합니다 (CDATA 섹션 내부의 텍스트는 파서에 의해 무시됩니다.) 예. <! [CDATA [일부 텍스트 및 추가 텍스트]]>
참고 : ‘&’ ‘<‘ ‘>’는 올바르게 처리되지 않으면 모두 문제가됩니다.
답변
이 기능을 사용하여 먼저 HTML을 정리하십시오.
$html = htmlspecialchars($html);
특수 문자는 일반적으로 HTML에서 다르게 표현되며 컴파일러에게 혼동을 줄 수 있습니다. 처럼 &
됩니다 &
.
답변
결합 된 버전을 사용합니다.
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
답변
문제
- URL에서 XML 파일을로드하는 동안 PHP 함수에서
simplexml_load_file
구문 분석 오류가 발생parser
합니다.
error : xmlParseEntityRef
원인
- URL에서 반환 된 XML은 유효한 XML이 아닙니다.
&
대신 값을 포함 합니다&
. 이 시점에서 분명하지 않은 다른 오류가있을 수 있습니다.
우리가 통제 할 수없는 것들
- 이상적으로는 유효한 XML이 PHP
simplexml_load_file
함수에 제공 되는지 확인해야 하지만 XML 생성 방법을 제어 할 수없는 것처럼 보입니다. simplexml_load_file
유효하지 않은 XML 파일 을 강제 로 처리 할 수도 없습니다 . XML 파일 자체를 수정하는 것 외에는 많은 옵션이 남지 않습니다.
가능한 해결책
잘못된 XML을 유효한 XML로 변환합니다. 을 사용하여 수행 할 수 있습니다 PHP tidy extension
. 추가 지침은 http://php.net/manual/en/book.tidy.php 에서 찾을 수 있습니다 .
확장이 존재하거나 설치되었는지 확인한 후 다음을 수행하십시오.
/**
* As per the question asked, the URL is loaded into a variable first,
* which we can assume to be $xml
*/
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<project orderno="6" campaign_name="International Relief & Development for under developed nations">
<invalid-data>Some other data containing & in it</invalid-data>
<unclosed-tag>
</project>
XML;
/**
* Whenever we use tidy it is best to pass some configuration options
* similar to $tidyConfig. In this particular case we are making sure that
* tidy understands that our input and output is XML.
*/
$tidyConfig = array (
'indent' => true,
'input-xml' => true,
'output-xml' => true,
'wrap' => 200
);
/**
* Now we can use tidy to parse the string and then repair it.
*/
$tidy = new tidy;
$tidy->parseString($xml, $tidyConfig, 'utf8');
$tidy->cleanRepair();
/**
* If we try to output the repaired XML string by echoing $tidy it should look like.
<?xml version="1.0" encoding="utf-8"?>
<project orderno="6" campaign_name="International Relief & Development for under developed nations">
<invalid-data>Some other data containing & in it</invalid-data>
<unclosed-tag></unclosed-tag>
</project>
* As you can see that & is now fixed in campaign_name attribute
* and also with-in invalid-data element. You can also see that the
* <unclosed-tag> which didn't had a close tag, has been fixed too.
*/
echo $tidy;
/**
* Now when we try to use simplexml_load_string to load the clean XML. When we
* try to print_r it should look something like below.
SimpleXMLElement Object
(
[@attributes] => Array
(
[orderno] => 6
[campaign_name] => International Relief & Development for under developed nations
)
[invalid-data] => Some other data containing & in it
[unclosed-tag] => SimpleXMLElement Object
(
)
)
*/
$simpleXmlElement = simplexml_load_string($tidy);
print_r($simpleXmlElement);
주의
개발자는 tidy를 사용한 후 부작용이 없는지 확인하기 위해 잘못된 XML을 유효한 XML (tidy에 의해 생성됨)과 비교해야합니다. Tidy는이를 올바르게 수행하는 데 매우 효과적이지만 시각적으로보고 100 % 확신하는 것은 결코 아프지 않습니다. 우리의 경우 $ xml과 $ tidy를 비교하는 것만 큼 간단해야합니다.
답변
답변
이것은 문자가 데이터를 엉망으로 만들었 기 때문입니다. 사용 htmlentities($yourText)
나를 위해 일한 (필자는 XML 문서 내부의 HTML 코드를했다). http://uk3.php.net/htmlentities를 참조하십시오 .