G
Ich hab zur Zeit das gleiche Problem.
Verursacht wird das durch die Formatierung bei der Ausgabe.
Beim nächsten Einlesen wird aus deiner "0" dann ein "\n0\n" da die zur Formatierung eingefügten Zeilenumbrüche als Bestandteils des Textes interpretiert werden. Beim nächsten Abspeichern kommen um das "\n0\n" dann wieder zusätzliche Zeilenumbrüche zur Formatierung.
Verhindern kann man das, indem man die XML Datei unformatiert (format_raw) abspeichert. Vielleicht kann man wich auch ein eigenes writer interface schreiben, das die entsprechenden Zeilenumbrüche wieder entfernt.
Edit:
Ich habe das jetzt gelöst indem ich ein zusätzliches Flag format_smart_raw eingeführt habe. Bei diesem Flag werden alle Knoten, die mehr als einen Unterknoten haben und wovon mindestens einer vom Typ node_pcdata ist als format_raw gespeichert.
Dein 1. Beispiel sieht damit so aus:
<root>
<test>0<Name>name</Name></test>
</root>
und dürfte beim erneuten Einlesen (egal mit welchem Parser) keine Probleme mehr machen.
Abgesehen davon wäre es bei dir vielleicht sinnvoller wenn name ein Attribut von test ist.
Hier das Diff:
diff org/pugixml.cpp src/pugixml.cpp
2942,2945c2942,2961
< writer.write('>', '\n');
<
< for (xml_node n = node.first_child(); n; n = n.next_sibling())
< node_output(writer, n, indent, flags, depth + 1);
---
> unsigned int smartflag = flags;
>
> if (flags & format_smart_raw)
> {
> for (xml_node n = node.first_child(); n; n = n.next_sibling())
> {
> if (n.type() == node_pcdata)
> {
> smartflag |= format_raw;
> break;
> }
> }
> }
> if (smartflag & format_raw)
> writer.write('>');
> else
> writer.write('>', '\n');
>
> for (xml_node n = node.first_child(); n; n = n.next_sibling())
> node_output(writer, n, indent, smartflag, depth + 1);
2947c2963
< if ((flags & format_indent) != 0 && (flags & format_raw) == 0)
---
> if ((flags & format_indent) != 0 && (smartflag & format_raw) == 0)
diff org/pugixml.hpp src/pugixml.hpp
192a193,195
> // Use smart raw output mode (no indentation and no line breaks are written for nodes with more than one children and one or more pcdata nodes). This flag is off by default.
> const unsigned int format_smart_raw = 0x10;
>