@@ -25,7 +25,7 @@ static void rapidxml_DocumentObject_dealloc(rapidxml_DocumentObject* self) {
2525
2626static int _parse (rapidxml_DocumentObject* self,
2727 Py_buffer* text_buff,
28- bool from_file) {
28+ bool from_file, bool parse_cdata= false ) {
2929 const char * text;
3030 std::vector<char > text_vector;
3131
@@ -43,9 +43,17 @@ static int _parse(rapidxml_DocumentObject* self,
4343 }
4444 try {
4545 self->base .base .document ->clear ();
46- (self->base .base .document
47- ->parse <rapidxml::parse_no_utf8 | rapidxml::parse_no_data_nodes>)
48- (self->base .base .document ->allocate_string (text));
46+ if (!parse_cdata){
47+ (self->base .base .document
48+ ->parse <rapidxml::parse_no_utf8 | rapidxml::parse_no_data_nodes>)
49+ (self->base .base .document ->allocate_string (text));
50+
51+ }else {
52+ (self->base .base .document
53+ ->parse <rapidxml::parse_declaration_node>)
54+ (self->base .base .document ->allocate_string (text));
55+ }
56+
4957 } catch (rapidxml::parse_error &e) {
5058 PyErr_SetString (rapidxml_RapidXmlError, e.what ());
5159 return 0 ;
@@ -58,17 +66,19 @@ static PyObject* rapidxml_DocumentObject_parse(rapidxml_DocumentObject* self,
5866 PyObject* kwds) {
5967 Py_buffer text_buff;
6068 PyObject* from_file_obj = NULL ;
69+ PyObject* read_cdata = NULL ;
6170 char kw_text[] = " text" ;
6271 char kw_from_file[] = " from_file" ;
72+ char kw_parse_cdata[] = " parse_cdata" ;
6373
64- static char * kwlist[] = {kw_text, kw_from_file, NULL };
65- if (!PyArg_ParseTupleAndKeywords (args, kwds, " s*|O " , kwlist,
66- &text_buff, &from_file_obj)) {
74+ static char * kwlist[] = {kw_text, kw_from_file, kw_parse_cdata, NULL };
75+ if (!PyArg_ParseTupleAndKeywords (args, kwds, " s*|OO " , kwlist,
76+ &text_buff, &from_file_obj, &read_cdata )) {
6777 return NULL ;
6878 }
6979
7080 if (!_parse (self, &text_buff,
71- (from_file_obj != NULL ) && PyObject_IsTrue (from_file_obj))) {
81+ (from_file_obj != NULL ) && PyObject_IsTrue (from_file_obj), (read_cdata != NULL ) && PyObject_IsTrue (read_cdata) )) {
7282 return NULL ;
7383 }
7484 Py_INCREF (Py_None);
@@ -80,21 +90,23 @@ static int rapidxml_DocumentObject_init(rapidxml_DocumentObject* self,
8090 PyObject* kwds) {
8191 Py_buffer text_buff = {0 };
8292 PyObject* from_file_obj = NULL ;
93+ PyObject* read_cdata = NULL ;
8394 char kw_text[] = " text" ;
8495 char kw_from_file[] = " from_file" ;
96+ char kw_parse_cdata[] = " parse_cdata" ;
8597
8698 if (rapidxml_NodeType.tp_init (reinterpret_cast <PyObject*>(self), args, kwds) < 0 ) {
8799 return -1 ;
88100 }
89- static char * kwlist[] = {kw_text, kw_from_file, NULL };
90- if (!PyArg_ParseTupleAndKeywords (args, kwds, " |s*O " , kwlist,
91- &text_buff, &from_file_obj)) {
101+ static char * kwlist[] = {kw_text, kw_from_file, kw_parse_cdata, NULL };
102+ if (!PyArg_ParseTupleAndKeywords (args, kwds, " |s*OO " , kwlist,
103+ &text_buff, &from_file_obj, &read_cdata )) {
92104 return -1 ;
93105 }
94106 self->base .base .underlying_obj = new rapidxml::xml_document<>();
95107 self->base .base .document = static_cast <rapidxml::xml_document<>*>(self->base .base .underlying_obj );
96108 if (text_buff.buf ) {
97- return _parse (self, &text_buff, (from_file_obj != NULL ) && PyObject_IsTrue (from_file_obj)) - 1 ;
109+ return _parse (self, &text_buff, (from_file_obj != NULL ) && PyObject_IsTrue (from_file_obj), (read_cdata != NULL ) && PyObject_IsTrue (read_cdata) ) - 1 ;
98110 }
99111 return 0 ;
100112}
0 commit comments