summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2015-12-03 11:43:58 +0000
committerNanang Izzuddin <nanang@teluu.com>2015-12-03 11:43:58 +0000
commitcef978c022b5e35cb024bb96668a0e1fb45da45a (patch)
tree759d5935061b39a103a5d8d2e9c47ef42b0d5329
parent565ed543b2e7d75b67ddb7e72c2f7120944cb3e7 (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
-rw-r--r--pjlib-util/src/pjlib-util/xml.c18
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);