PugiXML insert_child_after Leerzeilen in altem Child



  • Hallo,

    ich habe ein problem bei insert_child_after

    ich erstelle mit mit meinem code zurest folgendes Node

    doctest.append_child().set_name("root");  
    		xml_node root = doctest.child("root");
    		root.append_child().set_name("test");
    		xml_node test = Config.child("test");	
    		test.append_child(pugi::node_pcdata).set_value("0");
                      test.append_child().set_name("Name");
    		xml_node Name = test.child("Name");
    		Name.append_child(pugi::node_pcdata).set_value("Name");
    docConfig.save_file("../../test.xml","",format_no_declaration);
    

    Da kommt folgedes raus:

    <root>
    <test>
    0
    <Name>name</Name>
    </test>
    </root>
    

    nun will ich ein weiters Node anhängen(später im code bzw. in einer anderen if schleife)

    xml_node test = root.insert_child_after(pugi::node_element,root.last_child());
    
    node erstellung wie oben
    

    wird zwar das Node erstellt, aber die Datei sieht dann wie folgt aus:

    <root>
    <test>
    
    0
    
    <Name>name</Name>
    </test>
    <test>
    0
    <Name>name</Name>
    </test>
    </root>
    

    woher kommen die Leerzeilen?
    wenn ich noch ein weiteres node adde wird in jedem node, pro hinzugefügtem Node, immer eine leerzeile über und unter der Zahl hizugefügt!
    Also steht da nachher sowas wie z.B.

    <root>
    <test>
    
    0
    
    <Name>name</Name>
    </test>
    <test>
    
    0
    
    <Name>name</Name>
    </test>
    <Name>name</Name>
    </test>
    <test>
    0
    <Name>name</Name>
    </test>
    </root>
    

    woher kommen die leerzeilen bzw. wie kann ich sie verhindern??
    Ich will die Nr. so in der Datei stehen haben und kein neues Element oder attribut hinzufügen.

    gruß und danke



  • 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;
    >
    

Log in to reply