PHP : SimpleXMLElement로 <! [CDATA [를 처리하는 방법?


97

내가 사용하는 경우 것으로 나타났습니다 SimpleXMLElement그 CDATA 태그가 포함 된 문서에 내용이 항상 NULL. 이 문제를 어떻게 해결합니까?

또한 여기에서 XML에 대한 스팸을 보내 주셔서 죄송합니다. 나는 지금 몇 시간 동안 작동하도록 XML 기반 스크립트를 얻으려고 노력하고 있습니다 ...

<content><![CDATA[Hello, world!]]></content>

"SimpleXMLElement cdata"를 검색하면 Google에서 첫 번째 히트작을 시도했지만 작동하지 않았습니다.


노드 값에 어떻게 액세스하려고합니까? 그리고 SimpleXML이 요구 사항입니까?
allnightgrocery

나는 웹에서 찾을 수있는 다른 모든 기능 (xml2array 및 모든 것)을 시도했고 SimpleXML은 CDATA가 작동하지 않는 것을 제외하고는 좋은 결과를 제공하는 유일한 기능인 것 같습니다.
Angelo

1
DOMDocument ( php.net/manual/en/class.domdocument.php )를 사용하여 작업에서 많은 XML 구문 분석을 수행 합니다. CDATA 처리에서 잘 작동합니다. SimpleXML로 작업하는 방법을 볼 수 있도록 짧은 코드를 제공하거나 추가 코드를 게시하십시오.
allnightgrocery

답변:


182

아마도 올바르게 액세스하고 있지 않을 것입니다. 직접 출력하거나 문자열로 캐스트 할 수 있습니다. (이 예에서는 echo가 어쨌든 자동으로 수행하므로 캐스팅이 불필요합니다.)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
);
echo (string) $content;

// or with parent element:

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>'
);
echo (string) $foo->content;

당신은 더 나은 행운을 가질 수 있습니다 LIBXML_NOCDATA:

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
    , null
    , LIBXML_NOCDATA
);

2
아니요, PHP는 어떤 이유로 CDATA를 완전히 건너 뜁니다. 다른 아이디어가 있습니까?
Angelo

4
그렇다면 그것은 버그입니다. 작동 할 때까지 PHP / libxml을 업그레이드하십시오 (CDATA와 SimpleXML에 문제가 없었습니다.) 그렇지 않으면 LIBXML_NOCDATA로 운을 시험해 볼 수도 있습니다.
Josh Davis

5
나는 이것이 오래된 대답이라는 것을 알고 있지만 이 대답의 첫 번째 부분이 정확 하다는 것을 강조하고 싶습니다 . 결과를 인쇄 할 때 print_r실제로 올바르게 액세스하지 못하는 것입니다. 실제로 원하는 코드를 작성하십시오. 아마도 echo이나 (string)캐스트를 사용하여 작성하면 내용이 괜찮다는 것을 알 수 있습니다. LIBXML_NOCDATA를 사용하지 마십시오. 이는 관련이 없습니다.
IMSoP 2014

7
@IMSoP LIBXML_NOCDATA 추가 (다른 것은 변경하지 않음)가 작동하므로 관련성이 있는지 잘 모르겠습니다.
rand

3
@SimonePalazzo XML은 다양한 "노드"(예 : <anElement>a text node <aChildElement /> <![CDATA a cdata node]]> another text node</anElement>. CDATA 및 텍스트 노드는 서로 다른 유형이며 SimpleXML은이를 추적하므로 입력 한 XML을 다시 가져올 수 있습니다. SimpleXML 객체를 배열로 압축하면 CDATA 노드, 주석, 그렇지 않은 요소 등 많은 정보가 버려집니다. 현재 네임 스페이스 (예 :) <someNSPrefix:someElement />에서 텍스트의 자식 요소 위치 등은 LIBXML_NOCDATACDATA 노드를 텍스트 노드로 변환하지만 나머지는 수정하지 않습니다.
IMSoP 2005

48

LIBXML_NOCDATA의 세번째 파라미터 simplexml_load_file()함수. 이것은 모든 CDATA 데이터가 문자열로 변환 된 XML 객체를 반환합니다.

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);
echo "<pre>";
print_r($xml);
echo "</pre>";


SimpleXML에서 CDATA 수정


LIBXML_NOCDATA가이 작업을 수행하게 만든 것입니다. PHP 5.3.5
Mike_K

1
귀하의 대답은 LIBXML_NOCDATA 의미 를 설명하는 입니다. 감사합니다!
Marcio Mazzucato

14

이것은 나를 위해 트릭을했습니다.

echo trim($entry->title);

cdata (LIBXML_NOCDATA없이)를 유지해야하는 경우 완벽합니다
maztch

10

이것은 나를 위해 완벽하게 작동합니다.

$content = simplexml_load_string(
    $raw_xml
    , null
    , LIBXML_NOCDATA
);

0

언제 사용 LIBXML_NOCDATA합니까?

XML을 JSON으로 변환 할 때 문제를 추가합니다.

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo json_encode($xml, true); 
/* prints
   {
     "content": {}
   }
 */

SimpleXMLElement 개체에 액세스 할 때 CDATA를 가져옵니다.

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo $xml->content; 
/* prints
   Hello, world!
*/

문자열 캐스팅 기능을 트리거하기 위해 SimpleXMLElement에 액세스하지 않기 LIBXML_NOCDATA때문에 사용하는 것이 합리적 입니다.json_encode__toString()

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>", null, LIBXML_NOCDATA);
echo json_encode($xml);
/*
 {
   "content": "Hello, world!"
 }
*/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.