2014-09-15 2 views
0

CDATA로 XML 문자열을로드하는 방법이나 CDATA 컨텐트로 요소를 쓰는 방법에 대한 좋은 답변으로 많은 질문을 보았습니다.하지만 찾을 수 없었습니다. CDATA가 이미 포함 된 XML을 편집하고 $xml->asXML()을 사용한 후 이전 CDATA를 유지하는 방법.SimpleXMLElement를 사용하여 CDATA로 XML 편집

이미 CDATA가 포함 된 XML을 편집하고 $xml->asXML()을 사용한 후 이전 CDATA를 유지할 수있는 방법이 있습니까? 이 시나리오에서

봐는 :

<?php 
$str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>"; 

try { 
    echo "XML with CDATA: \n\n"; 
    $xml = simplexml_load_string($str_xml, null, LIBXML_NOCDATA); 
    echo $xml->asXML() ."\n\n"; 
} catch(Exception $e){ 
    echo "XML with CDATA: \n\n"; 
    echo $e->getMessage() ."\n\n"; 
} 
?> 

이 샘플을 실행 한 후, 출력은 : 당신이 볼 수 있듯이

<?xml version="1.0"?> 
<myxml><mytag>In this content, 8 &gt; 2 &amp; 1 &lt; 9, and 10 is a 10% of 100. </mytag></myxml> 

이 출력 XML 문자열은 더 이상하지 CDATA 태그 값이 있습니다. simplexml_load_string을이 출력으로로드하는 데 실패하지는 않지만 기존 CDATA 태그는 없어지고 특수 문자는 해당 html 엔티티로 대체됩니다.

나는 CDATA 노드 값의 수를 포함하는 모든 XML을 읽을 수있는 방법이 있는지 알고 있어야하고, 그 $xml->asXML()을 사용한 후, 출력 문자열은 여전히 ​​이전 CDATA 태그 값이 포함되어 있습니다.

도움 주셔서 감사합니다.

답변

2

LIBXML_NOCDATA을 전달할 때 SimpleXML에 XML을 제거하라고 지시했기 때문에 쓰여진 XML에는 CDATA 노드가 포함되어 있지 않습니다. 그들을 지키기 위해 단순히 그 옵션을 통과하지 마십시오! 아래

Here's a live demo of the fixed version

:

<?php 
$str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>"; 

try { 
    echo "XML with CDATA: \n\n"; 
    $xml = simplexml_load_string($str_xml); 
    echo $xml->asXML() ."\n\n"; 
} catch(Exception $e){ 
    echo "XML with CDATA: \n\n"; 
    echo $e->getMessage() ."\n\n"; 
} 

당신이 SimpleXML을 함께 CDATA 노드를 사용하려면 해당 옵션을 전달해야 당신에게 말하고 읽고 모든 답변과 의견은 매우 간단 잘못 있습니다. 유일한 문제는 print_r, var_dump 등의 출력이 SimpleXML에서 액세스 할 수있는 데이터의 전체 표현을 제공하지 않는다는 것입니다. 은 그것이 존재하지 않는다는 것을 의미하지 않습니다..

예제 XML의 텍스트를 가져 오려면 요소를 문자열로 캐스팅하면됩니다 (echo 문과 같은 일부 컨텍스트가 자동으로 수행됨). this example에서와 같이 :

$xml = simplexml_load_string($str_xml); 
$tag_content = (string)$xml->mytag; 
echo "Here is the content of the <mytag> node: $tag_content"; 
+1

우수! 물론 나는 CDATA 태그를 다루는 것이 특별한 옵션을 필요로한다고 생각했기 때문에 이런 식으로 다루려고 시도하지 않았다. 물론 CDATA 태그를 추가하는 것은 DOMDocument :: createCDATASection (이름을 짓기 위해)의 도움을 필요로 할 것이다. 감사!! –