AcDt_Dom_Garceta.pdf
-
Upload
alberto017 -
Category
Documents
-
view
169 -
download
2
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