diff options
-rw-r--r-- | pjlib-util/src/pjlib-util/xml.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/pjlib-util/src/pjlib-util/xml.c b/pjlib-util/src/pjlib-util/xml.c index 654dd559..296b232e 100644 --- a/pjlib-util/src/pjlib-util/xml.c +++ b/pjlib-util/src/pjlib-util/xml.c @@ -130,7 +130,9 @@ static pj_xml_node *xml_parse_node( pj_pool_t *pool, pj_scanner *scanner) on_syntax_error(scanner); /* Sub nodes. */ - while (*scanner->curptr == '<' && *(scanner->curptr+1) != '/') { + while (*scanner->curptr == '<' && *(scanner->curptr+1) != '/' + && *(scanner->curptr+1) != '!') + { pj_xml_node *sub_node = xml_parse_node(pool, scanner); pj_list_push_back( &node->node_head, sub_node ); } @@ -140,6 +142,20 @@ static pj_xml_node *xml_parse_node( pj_pool_t *pool, pj_scanner *scanner) pj_scan_get_until_ch(scanner, '<', &node->content); } + /* CDATA content. */ + if (*scanner->curptr == '<' && *(scanner->curptr+1) == '!' && + pj_scan_strcmp(scanner, "<![CDATA[", 9) == 0) + { + pj_scan_advance_n(scanner, 9, PJ_FALSE); + pj_scan_get_until_ch(scanner, ']', &node->content); + while (pj_scan_strcmp(scanner, "]]>", 3)) { + pj_str_t dummy; + pj_scan_get_until_ch(scanner, ']', &dummy); + } + node->content.slen = scanner->curptr - node->content.ptr; + pj_scan_advance_n(scanner, 3, PJ_TRUE); + } + /* Enclosing node. */ if (pj_scan_get_char(scanner) != '<' || pj_scan_get_char(scanner) != '/') on_syntax_error(scanner); |