2011-04-12 10 views
1

xml 파일을 읽고 쓰는데 libxml2를 사용하고 있습니다. 이제 CDATA 노드를 작성하려고합니다. 여기libxml2를 사용하여 CDATA 노드를 작성하는 방법은 무엇입니까?

내가 뭘하려 :

nodePtr = xmlNewChild(parentPtr, NULL, "foo", NULL); 
xmlNodeSetContentLen(nodePtr, "<![CDATA[\nTesting 1 < 2\n]]>", len); 

그러나,이 다음 인코딩 된 텍스트 결과 :

<foo>&lt;![CDATA[ 
Testing 1 &lt; 2 
]]&gt;</foo> 

것은 내가 아마 CDATA 특정 libxml2를의 API가있을 수 있다고 생각하고있다. 아니면 libxml2에 노드 내용을 자동으로 인코딩하지 않도록 다른 것을 호출해야합니까?

답변

3

알아 냈어. 이 트릭은 CDATA 텍스트 내용이 실제로 현재 노드의 일부가 아니라 자식임을 알게되며 중요한 API 호출은 xmlNewCDataBlock()입니다. 위와 같은 예를 사용하여 :

nodePtr = xmlNewChild(parentPtr, NULL, "foo", NULL); 
cdataPtr = xmlNewCDataBlock(doc, "Testing 1 < 2", 13); 
xmlAddChild(nodePtr, cdataPtr); 

이 다음과 같은 XML을 생성합니다 :

<foo><![CDATA[Testing 1 < 2]]></foo> 
+0

스테판의 일부인 경우는 문제가되지 것입니다 코드의 두 번째 줄 그것은 의사입니다. docptr을 사용하지 않고 할 수있는 방법이 있습니까? –

+0

@Stephane xmlNewChild는 3 개의 매개 변수를 사용합니다. 4. – milaniez

+0

@milaniez 2011 년에 이것을 썼음에 유의하십시오. 많은 것들이 2011 년과 2017 년 사이에 변경되었습니다! –

0

내가 libxml2를 모든 버전의 말할 수 없다, 그러나 반환 libxml2-2.9.4 doc 부분에 따라 xmlNewChild의 노드는 해당 상위 노드에서옵니다. 또한 xmlNewCDataBlock에서 반환 된 자식 노드의 부모는 doc 매개 변수로 설정됩니다. 그래서 다음은 좋은 방법이 될 것입니다 : 결과 XML은

<meow><![CDATA[said the kitty]]></meow> 

const char str[] = "said the kitty"; 
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "meow"); 
xmlNodePtr cdata_node = xmlNewCDataBlock(node->doc, BAD_CAST str, strlen(str)); 
xmlAddChild(node, cdata_node); 

입니다

그리고 node이 문서에서이 무엇 xmlDoc 여부

관련 문제