diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2015-12-03 11:43:58 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2015-12-03 11:43:58 +0000 |
commit | cef978c022b5e35cb024bb96668a0e1fb45da45a (patch) | |
tree | 759d5935061b39a103a5d8d2e9c47ef42b0d5329 /pjlib-util/src | |
parent | 565ed543b2e7d75b67ddb7e72c2f7120944cb3e7 (diff) |
Misc (re #1882): Added feature of CDATA content handling into XML parser.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5206 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib-util/src')
-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); |