-
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