java - How to modify a huge XML file by StAX? -


i have huge xml (~2gb) , need add new elements , modify old ones. example, have:

<books>     <book>....</book>     ...     <book>....</book> </books> 

and want get:

<books>    <book>       <index></index>       ....    </book>    ...    <book>       <index></index>       ....    </book> </books> 

i used following code:

xmlinputfactory infactory = xmlinputfactory.newinstance(); xmleventreader eventreader = infactory.createxmleventreader(new fileinputstream(file)); xmloutputfactory factory = xmloutputfactory.newinstance(); xmlstreamwriter writer = factory.createxmlstreamwriter(new filewriter(file, true)); while (eventreader.hasnext()) {    xmlevent event = eventreader.nextevent();    if (event.geteventtype() == xmlevent.start_element) {       if (event.asstartelement().getname().tostring().equalsignorecase("book")) {           writer.writestartelement("index");           writer.writeendelement();        }     } } writer.close(); 

but result following:

<books>    <book>....</book>    ....    <book>....</book> </books><index></index> 

any ideas?

try this

    xmlinputfactory infactory = xmlinputfactory.newinstance();     xmleventreader eventreader = infactory.createxmleventreader(new fileinputstream("1.xml"));     xmloutputfactory factory = xmloutputfactory.newinstance();     xmleventwriter writer = factory.createxmleventwriter(new filewriter(file));     xmleventfactory eventfactory = xmleventfactory.newinstance();     while (eventreader.hasnext()) {         xmlevent event = eventreader.nextevent();         writer.add(event);         if (event.geteventtype() == xmlevent.start_element) {             if (event.asstartelement().getname().tostring().equalsignorecase("book")) {                 writer.add(eventfactory.createstartelement("", null, "index"));                 writer.add(eventfactory.createendelement("", null, "index"));             }         }     }     writer.close(); 

notes

new filewriter(file, true) appending end of file, hardly need it

equalsignorecase("book") bad idea because xml case-sensitive


Comments

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -