diff options
author | Arseny Kapoulkine <arseny.kapoulkine@gmail.com> | 2016-01-12 20:01:44 -0800 |
---|---|---|
committer | Arseny Kapoulkine <arseny.kapoulkine@gmail.com> | 2016-01-12 20:01:44 -0800 |
commit | bcddf36559c4293d34fd275a4d392982fae94998 (patch) | |
tree | fe483fd31d6bddec9ce68f1baa62332752d22744 | |
parent | df2a0ad28b24681fdc39275b5260132b0a3e6918 (diff) |
Only save first PCDATA contents in the element
This change fixes an important ordering issue - if element node has a PCDATA
child *after* other elements, it's impossible to tell which order the children
were in.
Since the goal of PCDATA embedding is to save memory when it's the only child,
only apply the optimization to the first child. This seems to fix all
roundtripping issues so the only caveat is that the DOM structure is different.
-rw-r--r-- | src/pugixml.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 90c677e..f447e97 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -3360,7 +3360,11 @@ PUGI__NS_BEGIN if (cursor->parent || PUGI__OPTSET(parse_fragment)) { - if (!PUGI__OPTSET(parse_embed_pcdata)) + if (PUGI__OPTSET(parse_embed_pcdata) && cursor->parent && !cursor->first_child && !cursor->value) + { + cursor->value = s; // Save the offset. + } + else { PUGI__PUSHNODE(node_pcdata); // Append a new node on the tree. @@ -3368,11 +3372,6 @@ PUGI__NS_BEGIN PUGI__POPNODE(); // Pop since this is a standalone. } - else - { - if (cursor->parent && !cursor->value) - cursor->value = s; // Save the offset. - } s = strconv_pcdata(s); |