AcDt_Dom_Garceta.pdf

7
24 < ACCESO A DATOS > buffer.set],ength (10); //70 caracteres para e1 apellido file. writeChars (buffer. toString (l ) ; / / inqertar apellido file.writelnt (deP) ; /,/ insertar dePartamento file.writeDouble (sal-ario) ; / /inserLar sal-ario file. close O ,' / / cetrar fichero para modificar un registro determinado, accedemos a su Posición y efectuamos las modificacio- nes. El fichero debe abrirse en modo "rw'1 Por ejemplo para cambiar el dePartamento y salario del empleado con identificador 4 escribo: int registro = 4 ; / /id a modificar long posicion = (registro -1 ) x 36; // (4+20+4+B) posicion:posicion+4+20; //sumo el tamaño de lD+apellido fil-e. seek (posicion) ; / /nos posÍcionamos file.writernt(40) ; / /modif departamento fife.writeDouble (4000. 8'7) ; / /nodif safario Actividad 4: Crea un programa Java que reciba desde la línea de comandos un identificador de empleado y un importe. Se debe sumar al salario del empleado el importe tecleado. El programa debe visualizar el apellido, el salario ant¡guo y el nuevo. Si el identificador no existe se v¡sual¡zará un mensaje indicándolo. 1.7 TRABAJO CON FICHEROS XML y¡yIL (eXtensible Markup Language- Lenguaje de Etiquetado Extensible) es un metalenguaje, es decir, un lenguaje para la definición de lenguajes de marcado. Nos permite jerarquizar y estructurar la información así como describir los contenidos dentro del propio documento. Los ficheros XML son ficheros de texto escritos en lenguaje XML donde la información está organizada de forma secuencial y en orden jerárquico. Existen una serie de marcas especiales como son los símbolos menor que, < y mayor qqe , > que se usan para delimitar las marcas que dan la estructura al documento. Cada -ur." ii.rr" on nombre y puede tener 0 o más atributos. Un fichero XML sencillo tiene la siguiente estrucfura: _,_ <?xm1 version:"l-. 0" ?) <Empleados> <empleado) <id>1</id> <ape1 I ido>FERNANDE Z< / apel 1 ido> <dep>10</deP> <salario)100 0 . 45</saf ario> </emPleado> (empleado) <íd>2</id> ¿¡no l I ido)GIL</apeIlido> <deP>2 0</deP> (salario)24 00 . 6</salario>

Transcript of AcDt_Dom_Garceta.pdf

  • 24 < ACCESO A DATOS >

    buffer.set],ength (10); //70 caracteres para e1 apellidofile. writeChars (buffer. toString (l ) ; / / inqertar apellidofile.writelnt (deP) ; /,/ insertar dePartamentofile.writeDouble (sal-ario) ; / /inserLar sal-ariofile. close O ,' / / cetrar fichero

    para modificar un registro determinado, accedemos a su Posicin y efectuamos las modificacio-nes. El fichero debe abrirse en modo "rw'1 Por ejemplo para cambiar el dePartamento y salario delempleado con identificador 4 escribo:

    int registro = 4 ; / /id a modificar

    long posicion = (registro -1 ) x 36; // (4+20+4+B)posicion:posicion+4+20; //sumo el tamao de lD+apellidofil-e. seek (posicion) ; / /nos poscionamosfile.writernt(40) ; / /modif departamentofife.writeDouble (4000. 8'7) ; / /nodif safario

    Actividad 4: Crea un programa Java que reciba desde la lnea de comandos un identificadorde empleado y un importe. Se debe sumar al salario del empleado el importe tecleado. Elprograma debe visualizar el apellido, el salario antguo y el nuevo. Si el identificador noexiste se vsualzar un mensaje indicndolo.

    1.7 TRABAJO CON FICHEROS XMLyyIL (eXtensible Markup Language- Lenguaje de Etiquetado Extensible) es un metalenguaje, es

    decir, un lenguaje para la definicin de lenguajes de marcado. Nos permite jerarquizar y estructurarla informacin as como describir los contenidos dentro del propio documento. Los ficheros XML sonficheros de texto escritos en lenguaje XML donde la informacin est organizada de forma secuencialy en orden jerrquico. Existen una serie de marcas especiales como son los smbolos menor que,< y mayor qqe , > que se usan para delimitar las marcas que dan la estructura al documento. Cada

    -ur." ii.rr" on nombre y puede tener 0 o ms atributos. Un fichero XML sencillo tiene la siguienteestrucfura:

    _,_

  • DE FICHEROS

    (ernpleado)

    3LOpEZ< / apell ido>1 O

  • 26 < ACCESO A DATOS >

    Los programas |ava quenas de las que usaremos en

    mA,.itiEJO D

    -{ ;nmfinmm.l:r-y-,

    C.ra:g iffiils :as:,n *inlo

  • IIANEJO DE FICHEROS

    A continuacin se aaden los hijos de ese nodo (raiz), estos se aaden en la funcin(searElemento0:

    rearEfemento ("id", fnteger.toStrng(id) , raiz, document); / /aadir IDOrearElernento ( "apel]ido". apellidoS. trim O , raiz, document) ; / / aadir APELLIDOOrearElemento("dep",Integer.toString(dep), raiz, document);//aadir DEPOrearElemento("salario"rDouble.toString(salario), raiz, document);//lnadir SALARIO

    Como se puede ver la funcin recibe el nombre del nodo hljo (id, apellido, dep o salario) y sustos o valores que tienen que estar en formato String (1, FEKNANDEZ, 10, 1000.45), el nodo al que

    lrva a aadir (raiz) y el documento (document). Para crear el nodo hijo ( o o o ) se escribe:

    E]ement efem : document.createEfement (datoEmple) ; / /cxeamos un hrjoPara aadir su valor o su texto se usa el mtodo createTextNode(String):

    Text text = document.createTextNode(valor) //damos vafor

    A continuacin se aade el nodo hijo a la raz (empleado) y su texto o valor al nodo hijo:raiz.appendchild(elem) ; //peqamos el e]emento hijo a la raize1em. appendchil-d (text) ; / /pegamos el- val_orAl final se generara algo similar a esto por cada empleado:

    1FERNANDEz1 01 0 0 0 . 4 5< /empleado>

    La funcin es la siguiente:

    static void CrearElemento (String datoEmple, String va1or,Element raiz, Document document ) {

    Element efem : document.createElement(datoEnple) ; //creamos hijoText text : document.createTextNode(val-or) ; //damos vaforraiz.appendchild(elem); //pegamos el_ efemento hijo a la raizelem.appendchild(text) ; / /pegamos el valor

    ]

    En los ltimos pasos se crea la fuente XML a partir del documento:

    Source source : ner DOMSource (document) ;

    Se crea el resultado en el fichero Empleados.xml:

    Result result = ner StreamResul-t(new java.io.File("Emp1eados.xml") ) ; / /fic]h XMLSe obtiene un TransfomerFactory:

    27

    $, solo algu-

    ermite crear

    de este tipo.atributos.

    iona atribu-

    ados creadoios:

    el parser (seException:

    Empleados y

    null);-

    egistro crear,r (por ejem-ment(String)ayor que. El

    empleadodef doc

  • 28 < ACCESO A DATOS >

    Trans former trans former : Trans formerFactory. newlnstance ( ) . newTrans forner ( ).;

    Se realiza la transformacin del documento a fichero.

    transformer.lransform (source, resul-t) ;Para mostrar el documento por pantalla, podemos especifrcar como resultado el canal de salida

    System.out:

    Result console= new StreamResult (System.out) ;transformer.transform(source, console) ;

    --"---"'' ' ''.'.-,,iEl cdigo completo es el siguiente:

    mport org.w3c.dom.*;irnport javax.xml.parsers. *;import j avax. xm1. transform. * ;import j avax. xm1. transform. dom. * ;irnport javax.xml. transform. stream. *;iraport j ava. io. *;

    public class CrearEmpleadoXnl {public static void main(String argv[]) throws lOException{

    Fil-e fichero = new File ("c: \\EJERCICIOS\\UNI1\\AleatorioEmple.dat") ;RandomAccessFile file : new RandomAccessFile (ficheror "r") ;int id, dep, posicion:0; / /para situarnos al principio de} ficheroDouble salaro;char apellido[] : new char[10], aux;DocumentBuilderFactory factory = DocumentBuil-derFactory. nevrfnstance ( ) ;

    try{DocumentBuilder builder : factory - newDocumentBuilder ( ) ;DOMlmplementation implementation = builder. getDoMlmplementation ( ) ;Document document = implementation-createDocument (

    nul1, ".Emp1eados", nutl).; .do-9}L9]]!;:'e,*!mrler,s.i.sn("1.0'');//asLgnamoslaversiondenuestroXMLfor(;;) {

    fife. seek (posicion) ; / /nos posicionamosid=file.readlntO; // obtengo id de empleadofor (int i = 0; i < apellido.length; i++) {

    aux = fil-e,readChax(l;//recorro uno a uno 1os caracteres del apellidoapeJ-lidolil = aux; //Ios voy guardando en el array

    )string apellidos= new string(ape11ido) ;//convierto a string el arraydep=1i1".readrnt O; / /obLengo depsalario=fife.readDoubleO ; / /obLengo safario

    if(id>O) t //id validos a partir de 1-Efement raiz = document.createElement("empleado") ; / /nodo empleado

  • :o;

    de salida

    -1ido

    -oy

    TIANEJO DE FICHEROS 29

    document.getDocumentElement O . appendChild (raiz) ;CrearEfemento("id", Integer. toString(id) , raiz, document); //aadir IOCrearEfemento ("apel1ido", apellidoS.trim O, ra2, document) ; //ApellidoCrearEfemento ("dep", Integer .toString(dep) , r:at, document) ; //aadir DEPCrearEfemento("salario",Double.toString(sal-ario), raiz, document); //SAL)posicion: posicon + 36; / / me posiciono para el sig enpleadoif (file. getFilePointer O :: file. lenqth O ) break;

    ]//fin del for que recorre ef ficheroSource source : ner DOMSource (document),.Result result : new StreamResult (new java.io.Eile ("Empfeados.xml") ) ;Transformer transformer :

    TransformerFactory.newlnstance ( ) . newTransformer ( ) ;transformer. transform (source, resuft.) ;]catch(Exception e) {System. err.println("Error: "*e) ; ifil-e.cfoseO ; / /cerrar fichero

    I//fin de main/ /Insercn de fos datos del empleadostatic void CrearEfemento (String datoEmple, String valor,

    Element ra2, Document document) {Element elem = document. createElement (datoEmple) ; / / creamos hijoText text : document.createTextNode (valor) ; / /damos valorraiz.appendchild(elem); //pegamos el efemento hijo a la raizelem.appendchild(text) ; / /pegamos el valor] /:.'_r'., ".'.".", i !

    '://fin de fa clase

    Para leer un documento XML, creamos una instancia de DocumentBuilderFactory para construird parser y cargamos el documento con el mtodo p arse0:

    Document document = builder.parse (new File ("Empleados.xmf") ) ;

    Obtenemos la de nodos con nombre empleado de todo el documento:

    \odelist ernpleados : document . getElementsByTagName ( "emp1eado" ),-

    Se realiza un bucle para recorrer esta lista de nodos. Por cada nodo se obtienen sus etiquetas y susrilores llamando a la funcin getNodo0. El cdigo es el siguiente:

    i-oport j ava. j-o. File,.import j avax. xml.parsers, *;i:nport org. w3c. dom. * ;public class LecturaEmpleadoXml {public static void main(String argv[]) {

    DocumentBuilderFactory factory = DocumentBuifderFacLory. newlnstance O ;

  • 30 < ACCESO A DATOS >

    API DOM:

    Actividad 5: A partir del fichero de objetos Persona utilizado anteriormente' crea undocumento XML usando DOM.

    try {DocumentBuil-der buifder = factory'nelrDocumentBuilder () ;Document document : builder . parse (new Fi]-e (''Empleados . xml', ) ) ;document. getDocumentElement ( )' normalize ( ) ;System. out.println ("Elemento raz: " +

    document. qetDocumentBlernent O' getNodeName O ) ;//crea una lista con todos fos nodos empleadoNodelist empleados : document. getElementsByTagName ("empleado" ) ;/ /recorrer 1a listafor (int i : O,' i < empleados'getl'engtho; j- ++) {

    Node emple: empleados'item(i); //obtener un nodoif (emple'getNoerypeO == Node'E-LEMEN? NODE) tl/tipo de nodo

    Element efemento : (Element) emple; //obtener 1os elementos del nodoSystem.out'println("ID: " + getNodo("id"' elemento) );System.out.printfn("Apellido: " -t- qetNodo("ape11ido"' elemento) ) ;System.out.println(''DepartamenLo;''tgretlVodo(''dep'',elemento));System.out.println("Sa1ario""+getNodo("salario"'elemento))''

    ))] catch (Exception e) {e'printstackTraceO;}

    ]//fin de main//obtener l-a informacin de un nodoPtivate static String getNodo (String etiqueta' Element elem){

    Nodelist nodo: elem.getElementsByTagName(etiqueta).item(0)-getchildNodeso;Node valornodo = (Node) nodo'iten(0);return valornodo.getNodeValueo ;//devuelve el vafor deL nodo

    )I / /fin de la clase

    1.7.2 ACCESO A FICHEROS XML CON SAX

    SAX (APf Simple para XML) es un conjunto de clases e interfaces que ofrecen una herramientamuy til para el procesamiento de documentos XML' Permite analizar los documentos

    de forma

    secuencial (es decir, no carga todo el f,chero en memoria como hace DoM), esto implica poco con-sumo de memoria u.rrrqo.lo, documentos sean de gran tamao, en contraposicin, impide

    tener

    una visin global del documento que se va a analizar. sAX es ms complejo de programar que DOM'es un ApI totalmente escrita en ava e incluida dentro del JRE que nos permite crear nuestro

    propio

    parserdeXML' .^^--*^-ra\rTrrrT nrnrr 'rnalallamadaamtodos, loseven-La lectura de un documento XML produce eventos que ocasl(

    tos son encontrar Ia etiqueta de inicio y fin del documento (startDocument) y endDocument)),la

    tumm

    tfttE""ft"nl-jIgrry@rfr'tl"rmt!F-

    ffiecm

    lf ,rllrI

    - lCl

    -D[-n-tl-IH