Изменение XML с помощью JDOM

Я пытаюсь изменить XML-документ с помощью JDOM, проблема в том, что ничего не меняется в файле.

Я искал в Интернете, чтобы изменить файл, и на любом сайте объясняется, как сохранить файл.

Я хотел бы, чтобы вы сказали мне, что я делаю неправильно или есть ли другой способ.

Код метода:

public void ocuparPlazaParking(){

        //Se crea un SAXBuilder para poder parsear el archivo
        SAXBuilder builder = new SAXBuilder();
        File xmlFile = new File( "C:/Users/Alejandro/Parking/parking.xml");

        try
        {       
            Document document = (Document) builder.build( xmlFile );

            //Se obtiene la raiz 'parking'
            Element elementoParking = document.getRootElement();


            //Obtengo las plantas
            List listadePlantas =  elementoParking.getChildren( "planta" );
            for ( int i=0; i < listadePlantas.size(); i++ ){

                Element elementoPlanta = (Element) listadePlantas.get(i);       

                //Obtengo las filas
                List listadeFilas =  elementoPlanta.getChildren( "fila" );
                for ( int j = 0; j < listadeFilas.size(); j++ ){
                    //obtengo la fila
                    Element elementoFila = (Element) listadeFilas.get(j);           


                    //Obtengo los bloques

                    List listadeBloques =  elementoFila.getChildren( "bloque" );
                    for ( int k = 0; k < listadeBloques.size(); k++ ) {

                        Element elementoBloque = (Element) listadeBloques.get(k);


                        List listadeElementos =  elementoBloque.getChildren( "elemento" );
                        for ( int l = 0; l < listadeElementos.size(); l++ ){
                            Element elementoElemento = (Element) listadeElementos.get(l);

                            if(elementoElemento.getChildText("numero").equals("1003")){

                                elementoElemento.getChild("estado").setText("ocupada");
                            }

                        }    
                    }   
                }
            }  
        }

        catch ( IOException io ) {
            System.out.println( io.getMessage() );
        }catch ( JDOMException jdomex ) {
            System.out.println( jdomex.getMessage() );
        }           
    }   

И DTD XML:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT parking (planta+)>
<!ATTLIST parking nombreParking CDATA #REQUIRED>
<!ATTLIST parking direccion CDATA #REQUIRED>
<!ATTLIST parking poblacion CDATA #REQUIRED>
<!ATTLIST parking pais CDATA #IMPLIED>

<!ELEMENT planta (fila+)>
<!ATTLIST planta numPlazas CDATA #REQUIRED>
<!ATTLIST planta numeroPlanta CDATA #REQUIRED>
<!ATTLIST planta tamano CDATA #IMPLIED>

<!ELEMENT fila (bloque+)>
<!ATTLIST fila altoFila CDATA #REQUIRED>
<!ATTLIST fila anchoFila CDATA #REQUIRED>

<!ELEMENT bloque (elemento+)>
<!ATTLIST bloque anchoBloque CDATA #REQUIRED>

<!ELEMENT elemento (tipo,subtipo,estado,posicion,longitud,numero)>
<!ELEMENT tipo (#PCDATA)>
<!ELEMENT subtipo (#PCDATA)>
<!ELEMENT estado (#PCDATA)>
<!ELEMENT longitud (#PCDATA)>
<!ELEMENT posicion (#PCDATA)>
<!ELEMENT numero (#PCDATA)>

person Cence    schedule 28.05.2014    source источник
comment
Вы читаете файл xml в DOM и изменяете DOM. Я не вижу, где вы записываете измененный DOM обратно в файл. Вы действительно меняете файл в какой-то момент?   -  person Praba    schedule 28.05.2014
comment
я не знаю, как сохранить изменения в тот же xml   -  person Cence    schedule 28.05.2014
comment
@prabugp - обратите внимание, что пользователь загружается в JDOM, а не в DOM ... но вы правы, что он не сохраняется обратно.   -  person rolfl    schedule 28.05.2014


Ответы (1)


Энди предложил правильное решение, но не для той технологии.

Вы загружаете документ XML в модель JDOM в памяти. Вы меняете содержимое в модели памяти, но не записываете модель обратно на диск.... и для этого вам нужно использовать XMLOutputter

Вы захотите добавить следующее:

XMLOutputter xmlout = new XMLOutputter();
try (FileOutputStream fileout = new FileOutputStream("C:/Users/Alejandro/Parking/parking.MODIFIED.xml")) {
    xmlout.output(document, fileout);
}

Кроме того, ваш тег указывает, что вы используете JDOM2. В этом случае вы должны использовать списки с поддержкой Generics... поэтому ваш код должен выглядеть так (обратите внимание на отсутствие приведения...):

        //Obtengo las plantas
        List listadePlantas =  elementoParking.getChildren( "planta" );
        for ( int i=0; i < listadePlantas.size(); i++ ){

            Element elementoPlanta = (Element) listadePlantas.get(i);

Должен/может быть:

        //Obtengo las plantas
        for (Element elementoPlanta : elementoParking.getChildren( "planta" )){

(вы импортируете org.jdom.Element или org.jdom2.*...?)

Кроме того, в своем сообщении вы указываете, что выполняли поиск в Интернете.... Первые три результата для Google Поиск «JDOM Save File» хорош, но в последнее время полный руководство было составлено, и в нем есть раздел, посвященный XMLOutputter

person rolfl    schedule 28.05.2014