Sunteți pe pagina 1din 72

Apuntes de XML

Autor: Diego Arranz Hernando

Introduccin o Motivacin HTML y XML Para qu sirve XML? Principales usos o Terminologa o uadro del XML y alcance del curso reacin de documentos XML o !inta"is #n e$emplo completo %eglas &'sicas (tras construcciones )spacios de nom&res a&ecera Terminologa o %eglas de dise*o %estringir documentos XML o Por qu restringir los datos? o +T+,s #n e$emplo de +T+ )lementos -tri&utos +eclaracin +( T.P) )ntidades o )squemas XML )squemas XML vs +T+s #n primer e$emplo aractersticas )spacios de nom&res #so desde un documento M's estructuras Tipos -tri&utos Importar esquemas #n e$emplo completo (tras /ormas de construir esquemas XML Presentacin y trans/ormacin de documentos XML o Ho$as de estilo !! !! con XML #n e$emplo o Lengua$e X!LT Introduccin a X!LT 0enta$as y desventa$as 1ormas de uso #n e$emplo de 2o$a aractersticas XPat2 rear elementos (rdenaciones Manipulacin de XML desde programas 3ava o -nali4ar XML con !-X Introduccin a !-X )l anali4ador !-X #n primer e$emplo )l mane$ador de contenido

Los mtodos del mane$ador digo porta&le 0alidacin (tro e$emplo o Manipular XML con +(M Introduccin a +(M )l anali4ador +(M #n primer e$emplo Manipulacin del 'r&ol digo porta&le (tro e$emplo M's /ormas de manipular el 'r&ol rear documentos Imprimir documentos #n e$emplo Modi/icar documentos XML y las &ases de datos o 5enerar XML a partir de consultas o Trans/erir datos desde documentos XML o Herramientas o XML como almacn de datos (tros temas de inters o XLin6 o 3+(M (tra -PI m's 0enta$as y desventa$as #na -PI en desarrollo o Marcos de pu&licacin 7e& )l pro&lema !oluciones con tecnologa conocida ontenido y presentacin La solucin8 marcos de pu&licacin 7e& 0enta$as #n e$emplo de marco de pu&licacin8 ocoon !ervicios 7e& o Introduccin o Terminologa Tecnologas est'ndar -PIs 3ava o 3-X% %egistros Introduccin a 3-X% #n cliente 3-X% o 3-XM Mensa$es !(-P Introduccin a 3-XM )$emplos o 3-X9%P Introduccin #n e$emplo :i&liogra/a recomendada o )n ingls o )n castellano )nlaces recomendados o 5enerales o Introduccin o reacin de documentos XML o %estriccin de documentos XML

Presentacin y trans/ormacin de documentos XML Manipulacin de XML desde programas 3ava XML y las &ases de datos (tros temas de inters !ervicios 7e& Material utili4ado o :i&liogra/a o )nlaces o Herramientas )$ercicios o reacin de documentos XML )nunciado !olucin o +T+s )nunciado !olucin o )squemas XML )nunciado !olucin o X!LT )nunciado !olucin o !-X )nunciado !olucin o +(M )nunciado !olucin o +(M ;otro< )nunciado !olucin

o o o o o

Apuntes de XML
Autor: Diego Arranz Hernando

Introduccin o Motivacin HTML y XML Para qu sirve XML? Principales usos o Terminologa o uadro del XML y alcance del curso

Introduccin
Motivacin
HTML y XML
#na &uena /orma de entender en un primer vistazo qu es el lengua$e XML es compararlo con el so&radamente conocido lengua$e HTML= 0eamos primero un tro4o de cdigo HTML8
<h1> Comedor </h1> <ul> <li> <b>Mesa redonda de madera de arce</b>. El fabricante es <i>Muebles Albacete</i> y su precio 40000. </li> <li> <b>Dos sillas de madera de arce</b> de e!celente calidad con un co"#iacute$n a%ul cada una. </li> <li> <b>& sillas de madera de roble</b>. </li> </ul>

. a2ora un tro4o de cdigo XML equivalente8


<comedor> <mesa tipo'(redonda( madera'(arce(> <fabricante>Muebles Albacete</fabricante> <precio>40000</precio> </mesa> <silla madera'(arce(> <cantidad>)</cantidad> <calidad>e!celente</calidad> <co"in incluido'(s*(> <color>a%ul</color> </co"in> </silla> <silla madera'(roble(> <cantidad>&</cantidad> <calidad>normal</calidad> </silla> </comedor>

Lo /undamental8 o HTML8 orientado a la presentacin de datos=

XML8 orientado a los datos en s mismos= La principal ventaja de XML es que cualquier programa in/orm'tico tra&a$ar' me$or con datos en XML= HTML es un lenguaje de presentacin= +e/ine un con$unto de etiquetas y atri&utos v'lidos> una utili4acin v'lida de estos elementos y un signi/icado visual para cada elemento del lengua$e= XML no de/ine las etiquetas ni cmo se utili4an> slo de/ine unas pocas reglas sint'cticas para crear documentos= Por eso XML es un metalenguaje ;un lengua$e para de/inir otros lengua$es<= !ustituye XML a HTML? ?o> pues sirven para cosas distintas8 HTML para presentar in/ormacin en p'ginas 7e& y XML para representar e intercam&iar datos> independientemente de su presentacin= XML y HTML son complementarios=

o o

Para qu sirve XML! Principales usos

XML aplicado a los sitios "e#8 permite separar contenido y presentacin> y que los mismos datos se puedan mostrar de varias /ormas distintas sin demasiado es/uer4o= XML para la comunicacin entre aplicaciones8 representacin de los datos muy simple> /'cil de transmitir por la red> est'ndar= )n los @ltimos tiempos este uso se est' 2aciendo muy popular con el surgimiento de los Servicios web= XML para la con$iguracin de programas8 representacin de los datos simple y est'ndar> en contraposicin con los crpticos /ormatos propietarios=

Terminolog%a

XML& )s slo el metalengua$e so&re el que se construye todo= Por s mismo tiene un valor limitado= uando se 2a&la de XML> normalmente no se re/iere slo al lengua$e XML> sino tam&in a todos los lengua$es y 2erramientas relacionadas= 'T'& Lengua$e para esta&lecer restricciones en los documentos XML= (squema XML& (tro lengua$e para restringir los documentos XML> que soluciona diversos pro&lemas de las +T+s= X)LT& Lengua$e para trans/ormar documentos de un /ormato XML a otro /ormato ;HTML> otro voca&ulario XML> te"to plano> P+1> etc=< )AX& -PI que permite recorrer secuencialmente un documento XML> y responder a una serie de eventos= '*M& -PI que proporciona una representacin de los documentos XML en /orma de 'r&ol> permitiendo el recorrido y manipulacin de los datos= XHTML& %e/ormulacin del HTML como /ormato de datos XML= )*AP& Lengua$e que especi/ica la /orma de enviar contenido XML a travs de Internet= XML+,P-& Mecanismo para invocacin remota de procedimientos ;mtodos< utili4ando XML como /orma de comunicacin= )ervicios "e#& -plicaciones que se pu&lican en la 7e& y pueden ser accedidas de /orma est'ndar desde cualquier lugar de Internet=

-uadro del XML y alcance del curso



./cleo& !e tratar' en detalle el lengua$e XML= !e ver'n los aspectos m's importantes de los lengua$es +T+> esquemas XML y X!LT= !e introducir' XLin6= APIs 01sicas& !e ver' en detalle cmo tra&a$ar con !-X y +(M> utili4ando como lengua$e 3ava= )ervicios "e#& !e e"plicar' el por qu de su importancia y se detallar'n las tecnologas asociadas con ellos= APIs para servicios "e#& !e reali4ar' una introduccin a una serie de -PIs para tra&a$ar con servicios 7e& desde 3ava ;3-X%> 3-XM> 3-X9%P <= *tras aplicaciones y tecnolog%as& !e ver'n por encima algunos otros temas relacionados con XML8 o -plicacin de 2o$as !! a documentos XML o %elacin de XML con las &ases de datos o -lternativa a la -PI +(M para 3ava8 3+(M o Marcos de pu&licacin 7e& -l /inal de este documento se recoge una &i&liogra/a recomendada y numerosos enlaces de Internet para poder pro/undi4ar en cualquiera de los temas tratados en el curso=

Apuntes de XML
Autor: Diego Arranz Hernando

reacin de documentos XML o !inta"is #n e$emplo completo %eglas &'sicas (tras construcciones )spacios de nom&res a&ecera Terminologa o %eglas de dise*o

-reacin de documentos XML


)inta2is
3n ejemplo completo
)$emplo completo de documento XML8
<+!ml ,ersion'(1.0( encodin-'(./01223411( standalone'(no(+> <+!ml1stylesheet href'(librohtml.!sl( type'(te!t/!sl(+> <+!ml1stylesheet href'(libro5ml.!sl( type'(te!t/!sl( media'(5ap(+> <+cocoon1process type'(!slt(+> <611 7eferencia la D8D 11> <6D0C89:E ;ibro /9/8EM (libro.dtd(> <611 Comien%a el contenido 11> <;ibro !mlns'(http<//555.mislibros.com/libros/"a,a!ml( !mlns<Catalo-o'(http<//555.mislibros.com/catalo-o(> <8itulo>=a,a y >M;</8itulo> <Catalo-o</eccion>:ro-ramaci?n</Catalo-o</eccion> <Catalo-o</ub/eccion>>M;</Catalo-o</ub/eccion> <Contenido> <Capitulo materia'(>M;(> <8ema>.ntroducci?n</8ema> <subcapitulo1 apartados'(@(>AuB es</subcapitulo1> <subcapitulo1 apartados'(&(>C?mo se usa</subcapitulo1> </Capitulo> <Capitulo materia'(>M;(> <8ema>Creando >M;</8ema> <subcapitulo1 apartados'(0(>Cn documento >M;</subcapitulo1> <subcapitulo1 apartados'()(>;a cabecera</subcapitulo1> <subcapitulo1 apartados'(D(>El contenido</subcapitulo1> </Capitulo> <Capitulo materia'(=a,a(> <8ema>Anali%ando >M;</8ema> <subcapitulo1 apartados'(&(>:reparaci?n</subcapitulo1> <subcapitulo1 apartados'(&( dificil'(si(>/A></subcapitulo1> <subcapitulo1 apartados'(4( dificil'(si(>Mane"adores</subcapitulo1> <subcapitulo1 apartados'(0(>Cna forma me"or de car-ar el anali%ador</subcapitulo1> </Capitulo> </eparacion/> <Capitulo materia'(=a,a(>

<8ema>=D0M</8ema> <subcapitulo1 apartados'()(>.ntroducci?n</subcapitulo1> <subcapitulo1 apartados'(4( dificil'(si(>D0M#amp$=D0M</subcapitulo1> </Capitulo> </Contenido> <Compra> <6ECDA8AE <:aso 1>Encontrar una librer*a. <:aso )>Encontrar el libro. <:aso &>Comprar el libro. FF> </Compra> <Copyri-ht>#07eillyCopyri-ht$</Copyri-ht> </;ibro>

,eglas #1sicas

Hay dos tipos de construcciones8 el marcado ;entre <...> #...$ < y los datos de car1cter ;todo lo dem's<= Todo documento XML se compone de elementos= ada elemento est' delimitado por una etiqueta de comien4o y otra de /in> a no ser que sea vaco= Los elementos vacos constan de una @nica etiqueta= Los nom&res de las etiquetas son ar&itrarios y no pueden contener espacios= !iempre 2ay un elemento ra%z> cuya etiqueta de inicio 2a de ser la primera de todas y la de cierre la @ltima de todas= ada elemento puede contener datos de car'cter> elementos> am&as cosas a la ve4 o puede estar vaco= ?o se puede me4clar la anidacin de las etiquetas8 los elementos de&en a&rirse y cerrarse por orden= Los elementos pueden tener atri#utos ;propiedades< que nos o/recen in/ormacin so&re ellos= Los valores de los atri&utos de&en ir entrecomillados= Tanto atri&utos como valores son ar&itrarios= May/sculas y min/sculas no son intercam&ia&les= )l espacio en #lanco es li&re> se puede utili4ar para leer me$or el documento=

*tras construcciones

!e pueden utili4ar comentarios> que el anali4ador no tratar'> en cualquier sitio e"cepto dentro de las declaraciones> etiquetas y otros comentarios= Las secciones -'ATA sirven para introducir te"to que el anali4ador tendr' en cuenta como datos de car'cter> sin interpretarlo como XML= Las entidades prede$inidas permiten incluir ciertos caracteres sin que sean tomados como XML8 o AampB para el A o AltB para el C o AgtB para el D o AaposB para el , o AquotB para el E Podemos de/inir nuestras propias entidades> lo veremos con las +T+s=

(spacios de nom#res

Los espacios de nom#res sirven para evitar las colisiones entre elementos del mismo nom&re> y en general> para distinguir los distintos grupos de elementos en un mismo documento= ada espacio de nom&res se asocia con una 3,L> que slo sirve como identi/icador @nico y no tiene por qu ser v1lida=

-a#ecera

La ca#ecera> que es opcional aunque recomenda&le> da in/ormacin so&re cmo mane$ar el documento a los anali4adores y otras aplicaciones= Puede contener8 o #na declaracin XML para el anali4ador> con la versin> $uego de caracteres utili4ado> y una indicacin de si el documento es o no autnomo ;si requiere o no otros documentos<= o Instrucciones de proceso para otras aplicaciones= o #na declaracin '*-T4P(> que re/erencia a la +T+ que restringe el documento=

Terminolog%a

uando un documento cumple con las reglas sint'cticas que 2emos descrito> se le denomina documento #ien $ormado= #n documento v1lido> adem's de ser &ien /ormado> cumple las restricciones que le impone una +T+ o un esquema XML=

,eglas de dise5o

)l dise*o de la estructura de un documento XML no es una tarea trivial= +epende de un &uen an1lisis del pro&lema concreto a resolver ;cmo se va a utili4ar el documento<> lo cual queda /uera del alcance de este curso= ?o o&stante> se o/recen a continuacin algunas reglas pr'cticas= !iempre que sea posi&le> usar una 'T' o esquema e2istente= ?os a2orramos dise*ar los documentos XML y posi&ilita el intercam&io de datos con otros que utilicen la +T+ o esquema= La principal decisin es utili4ar para los datos de los elementos su#elementos o atri#utos= Por e$emplo8

<diapositi,a> <t*tulo>AGu* el t*tulo...</t*tulo> </diapositi,a> <diapositi,a t*tulo'(AGu* el t*tulo...(> ... </diapositi,a>

Hay una serie de criterios8 o !i el dato contiene su#estructuras8 elemento= o !i el dato es de gran tama5o8 elemento= o !i el dato cam#ia /recuentemente8 elemento= o !i el dato es de peque5o tama5o6 y raramente cam#ia8 normalmente> atri&uto= o !i el dato slo puede tener unos cuantos valores $ijos8 atri&uto= o )i el dato se va a mostrar a un usuario o aplicacin8 elemento= !i el dato gua el procesamiento del XML pero no se va a mostrar8 atri&uto=

Apuntes de XML
Autor: Diego Arranz Hernando

%estringir documentos XML o Por qu restringir los datos? o +T+,s #n e$emplo de +T+ )lementos -tri&utos +eclaracin +( T.P) )ntidades o )squemas XML )squemas XML vs +T+s #n primer e$emplo aractersticas )spacios de nom&res #so desde un documento M's estructuras Tipos -tri&utos Importar esquemas #n e$emplo completo (tras /ormas de construir esquemas XML

,estringir documentos XML


Por qu restringir los datos!

La primera ra4n es que podemos reali4ar compro#aciones estrictas so&re los datos> para asegurarnos de que tienen un /ormato v'lido de acuerdo a lo que queremos= (tra ra4n es la documentacin8 no siempre estar' claro para cualquier persona el signi/icado de un determinado documento XML8

<+!ml ,ersion'(1.0(+> <pa-ina> <pantalla> <nombre>Compras</nombre> <color>HCC4400</color> <fuente>Arial</fuente> </pantalla> <contenido> <p>AGui un monton de contenido</p> </contenido> </pa-ina> <+!ml ,ersion'(1.0(+> <pa-ina> <pantalla> <nombre>Compras</nombre> <color>HCC4400</color> <fuente>Arial</fuente> </pantalla> <pantalla> <nombre>Mensa"es</nombre> <color>H4400II</color> <fuente>Arial</fuente> </pantalla> <pantalla>

<nombre>Joticias</nombre> <color>HEECCEE</color> <fuente>Kel,etica</fuente> </pantalla> <contenido> <p>AGui un monton de contenido</p> </contenido> </pa-ina>

0iendo el primer e$emplo podemos pensar en que descri&e in/ormacin de una pantalla para determinado cliente= 0iendo el segundo> la interpretacin cam&ia= )n realidad> son varios enlaces a las pantallas disponi&les= Las +T+s y los esquemas XML aclaran situaciones de este tipo= (tra venta$a de los mecanismos de restriccin es que no 7ay que cam#iar el cdigo de las aplicaciones si las restricciones cam&ian ;slo las +T+s o esquemas que sean<= omo desventa$a> la validacin supone tiempo adicional de proceso= #na solucin posi&le para algunos sistemas es validar en la /ase de desarrollo y prue&as y quitar la validacin al implantar el sistema=

'T'8s
3n ejemplo de 'T'

Para utilizar una 'T' como mecanismo de restriccin> se especi/ica lo siguiente en el documento XML8
<6D0C89:E ;ibro /9/8EM (libro.dtd(>

+T+ para el ejemplo del li#ro8


<6E;EMEJ8 ;ibro L8itulo Catalo-o</eccion Catalo-o</ub/eccion Contenido Compra Copyri-htM> <6A88;./8 ;ibro !mlns CDA8A H7EAC.7ED !mlns<Catalo-o CDA8A H7EAC.7ED > <6E;EMEJ8 8itulo LH:CDA8AM> <6E;EMEJ8 Catalo-o</eccion LH:CDA8AM> <6E;EMEJ8 Catalo-o</ub/eccion LH:CDA8AM> <6E;EMEJ8 Contenido LLCapituloNMOLCapituloN /eparacion+MNM> <6E;EMEJ8 Capitulo L8ema /eccionNM> <6A88;./8 Capitulo materia L>M;O=a,aM (=a,a( > <6E;EMEJ8 8ema LH:CDA8AM> <6E;EMEJ8 /eccion LH:CDA8AM> <6A88;./8 /eccion apartados CDA8A H7EAC.7ED dificil LsiOnoM (no( > <6E;EMEJ8 /eparacion EM:89> <6E;EMEJ8 Compra LH:CDA8AM> <6E;EMEJ8 Copyri-ht LH:CDA8AM> <6EJ8.89 07eillyCopyri-ht /9/8EM (copyri-ht.t!t(>

(lementos

Los elementos permitidos se especi/ican con E;EMEJ8> seguido del nom&re y el tipo del elemento= Los elementos que se pueden anidar dentro de otros se especi/ican entre parntesis y separados por comas= Importa el orden= )l tipo menos restrictivo es -?.> que permite cualquier contenido para un elemento= Para datos de tipo te2to> se usa FP +-T-=

Para elementos vac%os> )MPT.= Modi/icadores de n/mero de ocurrencias8 o ?8 #na ve4 o ninguna o G8 -l menos una ve4 o H8 ualquier n@mero de veces o ninguna o ;nada<8 )"actamente una ve4 Para opciones alternativas8 separar con I=

Atri#utos

Los atri#utos permitidos para un elemento se especi/ican con A88;./8 y el nom&re del elemento seguido de los nom&res de los atri&utos> con un tipo y modi/icador o&ligatorios= )l tipo del atri#uto puede ser CDA8A para cualquier valor> o una enumeracin de los valores permitidos= (tros posi&les tipos son8 o JM80PEJ para restringir el valor a un nom#re XML v1lido ;es decir> que empiece con una letra o guin de su&rayado y contenga slo letras> n@meros> guiones de su&rayado> guiones y puntos> sin espacios< o .D> adem's de las restricciones que impone JM80PEJ> impone que el valor sea /nico en todo el documento= )l modi$icador puede ser H7EAC.7ED para atri&utos o&ligatorios> H.M:;.ED para opcionales> o HI.>ED ,alorQfi"o para valores /i$os= Tam&in puede ser un valor por de/ecto=

'eclaracin '*-T4P(

/9/8EM sirve para 'T's 9personales9= !e puede espici/icar un /ic2ero local o un /ic2ero

accesi&le a travs de una #%L= !e puede especi/icar una 'T' p/#lica con P#:LI > en la que queda re/le$ado el propietario de la misma> una descripcin y el idioma=
<6D0C89:E elemQrai% :CR;.C (1//S&C//D8D >K8M; 1.0 /trict//EJ( (http<//555.5&.or-/87/!html1/D8D/!html11strict.dtd(>

)s posi&le incrustar la 'T' internamente en el documento XML8


<6D0C89:E elemQrai% E ... F>

Incluso es posi&le tener una 'T' interna y otra e2terna= )n caso de con/lictos> prevalece siempre la interna=

(ntidades

)n la +T+ tam&in se especi/ica cmo resolver las entidades generales> con EJ8.89= !e puede especi/icar8 o +irectamente el contenido entre comillas= o )l contenido de un /ic2ero con /9/8EM= )n el documento XML se invocan con #...$ Tam&in son @tiles las entidades paramtricas> que a di/erencia de las generales se utili4an m's adelante en la misma +T+ en que se de/inen= !e invocan con J===B
<6EJ8.89 T /hape (LrectOcircleOpolyOdefaultM(>

(squemas XML
(squemas XML vs 'T's

:entajas so&re las +T+s8

,estricciones m1s precisas so&re los documentos XML ;tanto en estructura como en tipos de datos<= o !on documentos XML> por lo que la sinta"is es /amiliar y las 2erramientas los pueden mane$ar sin tcnicas especiales ;no como las +T+s<= o !oporte para espacios de nom#res= o Permiten de/inir elementos glo#ales y locales ;las +T+s slo glo&ales<= 'esventajas so&re las +T+s8 o M's complejos= )sto causa8 +i/icultades en su comprensin por 2umanos> so&re todo si est'n acostum&rados a las +T+s= Herramientas m's grandes y lentas= o Muc2as aplicaciones /uncionan ya so&re 'T's e2istentes ;la conversin es posi&le pero llevar' un tiempo<= o !e trata de una especi/icacin muy reciente> por lo que el soporte por parte de muc2as 2erramientas a@n est' en proceso=

3n primer ejemplo
Pasemos a esquema XML esta sencilla 'T'8
<6E;EMEJ8 <6E;EMEJ8 <6E;EMEJ8 <6E;EMEJ8 <6E;EMEJ8 <6E;EMEJ8 ;ibreria L;ibroMN> ;ibro L8itulo AutorN 8itulo LH:CDA8AM> Autor LH:CDA8AM> Iecha LH:CDA8AM> ./RJ LH:CDA8AM>

Iecha

./RJM>

#n esquema XML equivalente8


<+!ml ,ersion'(1.0(+> <!s<schema !mlns<!s'(http<//555.5&.or-/)001/>M;/chema( tar-etJamespace'(http<//555.libros.or-( !mlns'(http<//555.libros.or-( elementIormDefault'(Gualified(> <!s<element name'(;ibreria( type'(8ipo;ibreria(/> <!s<comple!8ype name'(8ipo;ibreria(> <!s<seGuence> <!s<element name'(;ibro( type'(8ipo;ibro( ma!0ccurs'(unbounded(/> </!s<seGuence> </!s<comple!8ype> <!s<comple!8ype name'(8ipo;ibro(> <!s<seGuence> <!s<element name'(8itulo( type'(!s<strin-(/> <!s<element name'(Autor( type'(!s<strin-( ma!0ccurs'(&(/> <!s<element name'(Iecha( type'(!s<strin-(/> <!s<element name'(./RJ( type'(!s<strin-(/> </!s<seGuence> </!s<comple!8ype> </!s<schema>

-aracter%sticas

(&servar que> a di/erencia de la +T+> es XML= (&servar cmo los elementos m's generales re$erencian a los m's concretos> 2asta llegar a los m's &'sicos= ?o es la @nica /orma de 2acerlo= min0ccurs y ma!0ccurs por de/ecto valen K= (&servar cmo de/inimos los elementos &'sicos como de tipo string= Los elementos vac%os se de/inen con un comple!8ype sin elementos=

(spacios de nom#res

Hay m/ltiples espacios de nom&res involucrados en un esquema8 o Para los elementos del propio esquema ;!mlns<!s<=

Para los elementos a restringir ;tar-etJamespace<= Para los elementos re$erenciados con el atri&uto ref L!mlnsM> se ver' un e$emplo al /inal= )l atri&uto elementIormDefault sirve para e"igir que al usar el esquema desde un documento los elementos se asocien con el tar-etJamespace del esquema=

o o

3so desde un documento


)ste es un peque*o documento XML que utili4a el esquema8
<+!ml ,ersion'(1.0(+> <;ibreria !mlns'(http<//555.libros.or-( !mlns<!si'(http<//555.5&.or-/)001/>M;/chema1instance( !si<schema;ocation'(http<//555.libros.or- libreria.!sd(> <;ibro> <8itulo>My ;ife and 8imes</8itulo> <Autor>:aul McCartney</Autor> <Autor>:hil McCartney</Autor> <Iecha>=uly 1442</Iecha> <./RJ>44&0&11)0)114&24)</./RJ> </;ibro> ... </;ibreria>

M1s estructuras


Tipos

(tras posi&ilidades de estructura> adem1s de sequence8 o choice8 Para alternativas= o all8 Para con$untos de elementos en los que no importa el orden= Las tres estructuras pueden tener ma!0ccurs ;en all el m'"imo es K< y min0ccurs

)n un esquema XML se pueden utili4ar tipos para los elementos y atri&utos> de /orma similar a cualquier lengua$e de programacin= )"isten una serie de tipos prede$inidos> algunos e$emplos8 o string o &oolean ;true9/alse< o integer o positiveInteger ;desde K< o decimal ;L=MN< o time ;228mm8ss< o date ;....9MM9++< o any#%I ;2ttp8OO777=7e&=com< o I+ y ?MT(P)? ;ver +T+s< )s posi&le crear nuevos tipos de datos a partir de los e"istentes> imponiendo restricciones a stos8

<!s<simple8ype name'(8ipoColores(> <!s<restriction base'(!s<strin-(> <!s<enumeration ,alue'(ro"o(/> <!s<enumeration ,alue'(blanco(/> <!s<enumeration ,alue'(a%ul(/> </!s<restriction> </!s<simple8ype> <!s<simple8ype name'(8ipoEdad(> <!s<restriction base'(!s<inte-er(> <!s<min.nclusi,e ,alue'(12(/> <!s<ma!.nclusi,e ,alue'(D3(/> </!s<restriction> </!s<simple8ype>

enumeration> min.nclusi,e y ma!.nclusi,e son algunos e$emplos de /acetas> 2ay muc2as

m's=

Atri#utos
0eamos cmo se tratan los atri&utos de los elementos= +ado el siguiente /ragmento de +T+8
<6E;EMEJ8 ;ibro L8itulo AutorN Iecha ./RJM> <6A88;./8 ;ibro Cate-oria Lbio-rafia O ensayo O ficcionM H7EAC.7ED Disponible Ltrue O falseM (false( Corrector CDA8A (( >

%esulta el siguiente /ragmento de esquema XML8


<!s<comple!8ype name'(8ipo;ibro(> <!s<seGuence> <!s<element name'(8itulo( type'(!s<strin-(/> <!s<element name'(Autor( type'(!s<strin-( ma!0ccurs'(&(/> <!s<element name'(Iecha( type'(!s<strin-(/> <!s<element name'(./RJ( type'(!s<strin-(/> </!s<seGuence> <!s<attribute name'(cate-oria( type'(8ipoCat( use'(reGuired(/> <!s<attribute name'(disponible( type'(!s<boolean( default'(false(/> <!s<attribute name'(corrector( type'(!s<strin-( default'((/> </!s<comple!8ype> <!s<simple8ype name'(8ipoCat(> <!s<restriction base'(!s<strin-(> <!s<enumeration ,alue'(bio-rafia(/> <!s<enumeration ,alue'(ensayo(/> <!s<enumeration ,alue'(ficcion(/> </!s<restriction> </!s<simple8ype>

!i un elemento tiene contenido simple y atri&utos ;por e$emplo8 <elem atr'h4>D@2</elem><> se restringe as8
<!s<element name'(elem(> <!s<comple!8ype> <!s<simpleContent> <!s<e!tension base'(!s<inte-er(> <!s<attribute name'(atr( type'(!s<strin-( use'(reGuired(/> </!s<e!tension> </!s<simpleContent> </!s<comple!8ype> </!s<element>

Importar esquemas

uando se de&en restringir varios espacios de nom&re> cada espacio se restringe en un esquema> y desde el principal se importan los dem's8
<!s<import schema;ocation'(111111.!sd(/>

3n ejemplo completo
Para terminar> un e$emplo completo de un esquema XML8
<+!ml ,ersion'(1.0(+> <!s<schema !mlns<!s'(http<//555.5&.or-/)001/>M;/chema( tar-etJamespace'(http<//555.miempresa.or-/pedidos( !mlns'(http<//555.miempresa.or-/pedidos( elementIormDefault'(Gualified(>

<!s<element name'(:edido( type'(8ipo:edido(/> <!s<comple!8ype name'(8ipo:edido(> <!s<seGuence> <!s<element name'(Destino( type'(8ipoDireccion(/> <!s<element name'(0rdenante( type'(8ipoDireccion(/> <!s<element name'(0bser,aciones( type'(!s<strin-( min0ccurs'(0(/> <!s<element name'(Contenido( type'(8ipoContenido(/> </!s<seGuence> <!s<attribute name'(fecha( type'(!s<date( use'(reGuired(/> </!s<comple!8ype> <!s<comple!8ype name'(8ipoDireccion(> <!s<seGuence> <!s<element name'(Jombre( type'(!s<strin-(/> <!s<element name'(Direccion( type'(!s<strin-(/> <!s<element name'(Ciudad( type'(!s<strin-(/> <!s<element name'(Cod:ostal( type'(8ipoCod:ostal(/> </!s<seGuence> </!s<comple!8ype> <!s<simple8ype name'(8ipoCod:ostal(> <!s<restriction base'(!s<positi,e.nte-er(> <!s<min.nclusi,e ,alue'(1000(/> <!s<ma!.nclusi,e ,alue'(D0000(/> </!s<restriction> </!s<simple8ype> <!s<comple!8ype name'(8ipoContenido(> <!s<seGuence> <!s<element name'(:roducto( type'(8ipo:roducto( ma!0ccurs'(unbounded(/> </!s<seGuence> </!s<comple!8ype> <!s<comple!8ype name'(8ipo:roducto(> <!s<seGuence> <!s<element name'(Jombre( type'(!s<strin-(/> <!s<element name'(Cantidad( type'(8ipoCantidad(/> <!s<element name'(:recio( type'(!s<decimal(/> <!s<element name'(0bser,aciones( type'(!s<strin-( min0ccurs'(0(/> </!s<seGuence> <!s<attribute name'(codi-o( type'(8ipoCodi-o( use'(reGuired(/> </!s<comple!8ype> <!s<simple8ype name'(8ipoCantidad(> <!s<restriction base'(!s<positi,e.nte-er(> <!s<ma!E!clusi,e ,alue'(100(/> </!s<restriction> </!s<simple8ype> <!s<simple8ype name'(8ipoCodi-o(> <!s<restriction base'(!s<strin-(> <!s<pattern ,alue'(UdV&W1EA1XFV)W(/> </!s<restriction> </!s<simple8ype> </!s<schema>

. un documento que lo utili4a8


<+!ml ,ersion'(1.0( encodin-'(./01223411(+> <:edido !mlns'(http<//555.miempresa.or-/pedidos( !mlns<!si'(http<//555.5&.or-/)001/>M;/chema1instance( !si<schema;ocation'(http<//555.miempresa.or-/pedidos pedido.!sd( fecha'(14441101)0(> <Destino> <Jombre>Alicia Abad</Jombre> <Direccion>:la%a de la DuGuesa 1)</Direccion> <Ciudad>Albacete</Ciudad> <Cod:ostal>030)0</Cod:ostal>

</Destino> <0rdenante> <Jombre>7oberto Mo,illa</Jombre> <Direccion>Yeneral 7icardos 3D</Direccion> <Ciudad>Madrid</Ciudad> <Cod:ostal>)2033</Cod:ostal> </0rdenante> <0bser,aciones>Es ur-ente mi cesped estZ muy alto</0bser,aciones> <Contenido> <:roducto codi-o'(2@)1AA(> <Jombre>Cortadora de cesped</Jombre> <Cantidad>1</Cantidad> <:recio>142.43</:recio> <0bser,aciones>Confirmar Gue es elBctrica</0bser,aciones> </:roducto> <:roducto codi-o'(4)D1IK(> <Jombre>8aladradora</Jombre> <Cantidad>&</Cantidad> <:recio>10.42</:recio> </:roducto> </Contenido> </:edido>

*tras $ormas de construir esquemas XML


Anidando los elementos8
<+!ml ,ersion'(1.0(+> <!sd<schema !mlns<!sd'(http<//555.5&.or-/)001/>M;/chema( tar-etJamespace'(http<//555.libros.or-( !mlns'(http<//555.libros.or-(> <!sd<element name'(;ibreria(> <!sd<comple!8ype> <!sd<seGuence> <!sd<element name'(;ibro( ma!0ccurs'(unbounded(> <!sd<comple!8ype> <!sd<seGuence> <!sd<element name'(8itulo( type'(!sd<strin-(/> <!sd<element name'(Autor( type'(!sd<strin-(/> <!sd<element name'(Iecha( type'(!sd<strin-(/> <!sd<element name'(./RJ( type'(!sd<strin-(/> </!sd<seGuence> </!sd<comple!8ype> </!sd<element> </!sd<seGuence> </!sd<comple!8ype> </!sd<element> </!sd<schema>

,e$erenciando a los elementos8


<+!ml ,ersion'(1.0(+> <!s<schema !mlns<!s'(http<//555.5&.or-/)001/>M;/chema( tar-etJamespace'(http<//555.libros.or-( !mlns'(http<//555.libros.or-(> <!s<element name'(;ibreria(> <!s<comple!8ype> <!s<seGuence> <!s<element ref'(;ibro( min0ccurs'(1( ma!0ccurs'(unbounded(/> </!s<seGuence> </!s<comple!8ype> </!s<element> <!s<element name'(;ibro(> <!s<comple!8ype> <!s<seGuence> <!s<element ref'(8itulo( min0ccurs'(1( ma!0ccurs'(1(/> <!s<element ref'(Autor( min0ccurs'(1( ma!0ccurs'(unbounded(/> <!s<element ref'(Iecha( min0ccurs'(1( ma!0ccurs'(1(/> <!s<element ref'(./RJ( min0ccurs'(1( ma!0ccurs'(1(/> </!s<seGuence>

</!s<comple!8ype> </!s<element> <!s<element name'(8itulo( type'(!s<strin-(/> <!s<element name'(Autor( type'(!s<strin-(/> <!s<element name'(Iecha( type'(!s<strin-(/> <!s<element name'(./RJ( type'(!s<strin-(/> </!s<schema>

)n am&os casos se utili4an tipos complejos annimos ;sin nom&re<= !e puede 2acer lo mismo con los tipos simples=

Apuntes de XML
Autor: Diego Arranz Hernando

Presentacin y trans/ormacin de documentos XML o Ho$as de estilo !! !! con XML #n e$emplo o Lengua$e X!LT Introduccin a X!LT 0enta$as y desventa$as 1ormas de uso #n e$emplo de 2o$a aractersticas XPat2 rear elementos (rdenaciones

Presentacin y trans$ormacin de documentos XML


Hojas de estilo -))
-)) con XML

-)) es un lengua$e de 2o$as de estilo que se utili4a normalmente para controlar la presentacin de documentos HTML> pero tam&in se puede utili4ar con documentos XML= !u principal caracterstica> en contraste con el lengua$e X!LT> es su sencille4= :entajas& o ;1cil de aprender y utili4ar= Muc2os desarrolladores ya lo conocen= o onsume poca memoria y tiempo de proceso> pues no construye una representacin en ar&ol del documento= o Muestra el documento seg@n se va procesando= 'esventajas& o !lo sirve para visuali4ar documentos en un navegador= o ?o permite reali4ar manipulaciones so&re el documento> tales como a*adir y &orrar elementos> reali4ar ordenaciones> etc= o !lo permite acceder al contenido de los elementos= ?o a los atri&utos> instrucciones de proceso> etc= o #tili4a una sinta2is di/erente a la del XML=

3n ejemplo
(jemplo de documento XML8
<+!ml ,ersion'(1.0( +> <+!ml1stylesheet type'(te!t/css( href'(proyectos.css( +> <RDQ:royectos> <:royecto pid'(03111001( tipo'(Seb( comien%o'(11/1/03(> <JombreQ:roy> >ray Mind ;earners Seb /ite </JombreQ:roy> <Contacto tipo'(primario(> <Jombre>Pell Attain</Jombre> <Direccion> Seb 7a,in Consultin- DD1 0a[ey 7d</Direccion> <8lf> 111133311111 </8lf> <Ia!> 11113331)))) </Ia!> <E1Mail> [attain\5ebra,in.com </E1Mail> </Contacto> <Contacto tipo'(mar[etin-(> <Jombre> Irancis Chillin-ton </Jombre>

<Direccion> Seb 7a,in Consultin- DD1 0a[ey 7d</Direccion> <8lf> 11113331111) </8lf> <Ia!> 11113331)))) </Ia!> <E1Mail> fchillin-ton\5ebra,in.com </E1Mail> </Contacto> <Contacto tipo'(-raficos(> <Jombre> ;ara Iire5al[er </Jombre> <Direccion> Seb 7a,in Consultin- DD1 0a[ey 7d</Direccion> <8lf> 11113331111& </8lf> <Ia!> 11113331)))) </Ia!> <E1Mail> lfire5al[er\5ebra,in.com </E1Mail> </Contacto> <Jotas> <Entrada fecha'(11/0&/03( contacto'([ta001(> De,elopment on the Seb site has started. 8he primary -raphics 1 lo-o O bac[-rounds O na,i-ation system 1 should be done by 11/2/00. </Entrada> </Jotas> </:royecto> <:royecto pid'(0311100)( tipo'(Database(> <JombreQ:roy> >M; Database for /ite ]isitors </JombreQ:roy> <Contacto tipo'(primario(> <Jombre> 8om :hannon </Jombre> <Direccion> Seb 7a,in Consultin- DD1 0a[ey 7d</Direccion> <8lf> 1111333111)) </8lf> <Ia!> 11113331)))) </Ia!> <E1Mail> tphannon\5ebra,in.com </E1Mail> </Contacto> <Jotas> <Entrada fecha'(11/10/03(> Database structure is complete. 7eady to start propa-atin- the data. </Entrada> </Jotas> </:royecto> <:royecto tipo'(A.(> <JombreQ:roy> Kouse of Ylass </JombreQ:roy> <Contacto tipo'(primario(> <Jombre> /hamu Sa-onride </Jombre> <Direccion> Seb 7a,in Consultin- DD1 0a[ey 7d</Direccion> <8lf> 1111333111&& </8lf> <Ia!> 11113331)))) </Ia!> <E1Mail> shamu\5a-onride.com </E1Mail> </Contacto> <Jotas> <Entrada fecha'(11/01/03(> A. lo-ic model soft5are has been pic[ed out and ordered as 5ell as the eGuipment reGuired to run it. Jet5or[in- LM./M has been notified of the machine^s arri,al and net5or[in- needs. </Entrada> <Entrada fecha'(11/11/03(> M./ has recei,ed eGuipment and soft5are and is startin- the installation. E!pected date for net5or[ connection is 11/13/03. </Entrada> </Jotas> </:royecto> </RDQ:royectos>

Hoja de estilo para visuali4ar el documento en un navegador8


:royecto Vdisplay< bloc[$ bac[-round< blue$ font1family< sans1serif$ mar-in< 1cmW

JombreQ:roy Vdisplay< bloc[$ bac[-round< HII0000$ font1si%e< lar-er$ font15ei-ht< bold$ color< yello5$ font1family< Arial$ border< HII0000$

border1style< doubleW Contacto Vdisplay< bloc[$ paddin-< 3pt$ te!t1indent< 1cmW Vdisplay< bloc[$ font1,ariant< small1caps$ font1si%e< medium$ font15ei-ht< bold$ color< redW

Jombre

Direccion Vdisplay< bloc[$ font1style< italic$ font1si%e< smaller$ color< 5hiteW 8lf Vdisplay< bloc[$ font15ei-ht< bold$ font1si%e< smaller$ color< 5hiteW Vdisplay< bloc[$ font15ei-ht< bold$ font1si%e< smaller$ color< 5hiteW Vdisplay< bloc[$ font15ei-ht< bold$ font1style< italic$ color< 5hiteW Vdisplay< bloc[$ font1style< italic$ color< 5hite$ paddin-< &emW Vdisplay< bloc[W

Ia!

E1Mail

Jotas

Entrada

Lenguaje X)LT
Introduccin a X)LT

Para aclarar terminologa> X)L es un est'ndar que se compone de dos partes di/erenciadas8 o X)LT8 Lengua$e para trans/ormar documentos XML en otro /ormato ;otro XML> HTML> +HTML> te"to plano> P+1> %T1> Qord> etc=< o X)L+;*8 )speci/icacin que trata cmo de&en ser los o&$etos de /ormato para convertir XML a /ormatos &inarios ;P+1> Qord> im'genes> etc=< La principal caracterstica del lengua$e X!LT es su potencia= ?o es slo un lengua$e para visuali4ar documentos> sino en general para trans/ormarlos y manipularlos= )sta manipulacin la gestiona un programa especial que se llama procesador X)LT= )"isten distintos procesadores disponi&les> como Xalan> del proyecto cola&orativo de cdigo a&ierto Apache=

:entajas y desventajas

:entajas& o La salida no tiene por qu ser HTML para visuali4acin en un navegador> sino que puede estar en muc7os $ormatos= o Permite manipular de muy diversas maneras un documento XML8 reordenar elementos> /iltrar> a*adir> &orrar> etc= o Permite acceder a todo el documento XML> no slo al contenido de los elementos= o X!LT es un lenguaje XML> por lo que no 2ay que aprender nada especial acerca de su sinta"is= 'esventajas& o !u utilizacin es m's comple$a=

-onsume cierta memoria y capacidad de proceso> pues se construye un 'r&ol con el contenido del documento=

;ormas de uso

0isuali4ar directamente en un navegador el documento XML que tiene asociada una 2o$a X!LT= )l navegador de&e tener incorporado un procesador X!LT= )$ecutar el procesador X!LT independientemente del navegador= !e le pasan las entradas necesarias ;/ic2ero origen y 2o$a X!LT a utili4ar< y genera la salida en un /ic2ero> con el que podemos 2acer lo que queramos= %eali4ar las trans/ormaciones dentro de un programa en el servidor y enviar a los clientes slo el resultado de la trans/ormacin=

3n ejemplo de 7oja
Ho$a de estilo X!LT para el ejemplo del li#ro8
<+!ml ,ersion'(1.0(+> <!sl<stylesheet !mlns<!sl'(http<//555.5&.or-/1444/>/;/8ransform( !mlns<;ib'(http<//555.mislibros.com/libros/"a,a!ml( !mlns<Catalo-o'(http<//555.mislibros.com/catalo-o( ,ersion'(1.0(> <!sl<template match'(;ib<;ibro(> <html> <head> <title><!sl<,alue1of select'(;ib<8itulo( /> L<!sl<,alue1of select'(Catalo-o</eccion( />< <!sl<,alue1of select'(Catalo-o</ub/eccion( />M </title> </head> <body> <!sl<apply1templates select'(;ib<Contenido( /> <i><!sl<,alue1of select'(;ib<Copyri-ht( /></i> </body> </html> </!sl<template> <!sl<template match'(;ib<Contenido(> <center> <h1>Contenidos</h1> </center> <hr/> <ul> <!sl<for1each select'(;ib<Capitulo(> <!sl<choose> <!sl<5hen test'(\materia'^=a,a^(> <li><!sl<,alue1of select'(;ib<8ema( /> L=a,aM</li> </!sl<5hen> <!sl<other5ise> <li><!sl<,alue1of select'(;ib<8ema( /> LJo =a,aM</li> </!sl<other5ise> </!sl<choose> </!sl<for1each> </ul> </!sl<template> </!sl<stylesheet>

-aracter%sticas

!e puede o&servar que una 2o$a de estilo X!LT es un documento XML= )l elemento ra%z es stylesheet> en el que se especi/ican los espacios de nom#re para la propia 2o$a de estilo y para el documento XML que se quiere presentar=


XPat7

ada elemento template se asocia con un /ragmento del documento XML ;que puede ser un elemento o un con$unto de elementos< y se trans$orma en otro $ragmento de XML> seg@n una serie de reglas que se especi/ican en su interior= )l elemento ,alue1of e2trae un valor concreto del documento= )l elemento apply1templates aplica las plantillas que se especi/iquen e inserta la salida de las mismas= Para iterar so#re una serie de elementos que se repiten se utili4a for1each= Para realizar distintos procesamientos en /uncin de los datos se puede utili4ar el elemento choose> que se compone de un n@mero de elementos 5hen> cada uno con un caso distinto> y un elemento opcional other5ise que se re/iere al caso por de/ecto= Para procesar o no un elemento en /uncin de una condicin se utili4ara simplemente el elemento if> especi/icando la condicin en el atri&uto test= )l HTML que se especi/ica en las plantillas de&e seguir las reglas del XML ;es decir> de&e ser XHTML<=

Las e2presiones que pueden aparecer en los atri&utos select> match o test de los elementos e"plicados siguen el lenguaje XPat7> y pueden llegar a ser todo lo comple$as que se requiera= 0eamos un e$emplo so&re el mismo documento del li&ro con algunas e2presiones XPat7= )ste e$emplo muestra una lista con las secciones de R m's apartados de captulos cuya materia sea 3ava> numer'ndolas e indicando a qu captulo pertenecen=

<+!ml ,ersion'(1.0(+> <!sl<stylesheet !mlns<!sl'(http<//555.5&.or-/1444/>/;/8ransform( !mlns<;ib'(http<//555.mislibros.com/libros/"a,a!ml( ,ersion'(1.0(> <!sl<template match'(;ib<;ibro(> <html><body> <ul> <!sl<for1each select'(;ib<Contenido/;ib<CapituloE\materia'^=a,a^F /;ib</eccionE\apartados>'&F(> <li> <!sl<,alue1of select'(positionLM( />< <!sl<,alue1of select'(.( /> de <!sl<,alue1of select'(precedin-1siblin-<<;ib<8ema( /> </li> </!sl<for1each> </ul> </body></html> </!sl<template> </!sl<stylesheet>

La especi/icacin XPat2 contiene muc2as comple$idades que no podemos detenernos a cu&rir> pero destaquemos algunos aspectos del e$emplo8 o Para descender por la $erarqua de elementos se utili4a el separador O= o !e pueden imponer restricciones al con$unto de nodos e"trados> entre corc2etes= o )"isten una serie de $unciones prede/inidas> como positionLM> que nos da el n@mero de orden de un nodo respecto al con$unto de nodos e"trados= o !e puede tra&a$ar con los nodos relacionados con el actual ;nodo padre> 2i$os> nodos al mismo nivel> etc=< mediante una serie de e$es> como precedin-1siblin-> que nos da los nodos anteriores al actual del mismo nivel=

-rear elementos

on X!LT tam&in es posi&le crear nuevos elementos mediante las etiquetas element y attribute= )sto sirve para crear elementos con alg@n atri&uto no conocido a priori> que de&e tomarse del /ic2ero XML= -*adimos el siguiente $ragmento de XML al /inal del documento del li&ro> a partir del cual queremos generar enlaces HTML8

<7eferencias> <7eferencia> <Jombre>>/; en el S&C</Jombre> <Crl>http<//555.5&.or-//tyle/>/;</Crl> </7eferencia> <7eferencia> <Jombre>;ista >/;</Jombre> <Crl>http<//555.mulberrytech.com/!sl/!sl1list</Crl> </7eferencia> </7eferencias>

)l /ragmento de X!LT que genera los enlaces es8


<!sl<template match'(;ib<7eferencias(> <p> <center><h&>7eferencias _tiles</h&></center> <ol> <!sl<for1each select'(;ib<7eferencia(> <li> <!sl<element name'(a(> <!sl<attribute name'(href(> <!sl<,alue1of select'(;ib<Crl( /> </!sl<attribute> <!sl<,alue1of select'(;ib<Jombre( /> </!sl<element> </li> </!sl<for1each> </ol> </p> </!sl<template> L7ecordar aplicar la nue,a plantilla<M <!sl<apply1templates select'(;ib<ContenidoO;ib<7eferencias( />

*rdenaciones

!i queremos ordenar los captulos al/a&ticamente> slo tenemos que a*adir lo siguiente tras el elemento for1each8
<!sl<sort select'(;ib<8ema(/>

!e puede ordenar descendentemente a*adiendo al elemento sort el atri&uto


order'(descendin-(

Apuntes de XML
Autor: Diego Arranz Hernando

Manipulacin de XML desde programas 3ava o -nali4ar XML con !-X Introduccin a !-X )l anali4ador !-X #n primer e$emplo )l mane$ador de contenido Los mtodos del mane$ador digo porta&le 0alidacin (tro e$emplo o Manipular XML con +(M Introduccin a +(M )l anali4ador +(M #n primer e$emplo Manipulacin del 'r&ol digo porta&le (tro e$emplo M's /ormas de manipular el 'r&ol rear documentos Imprimir documentos #n e$emplo Modi/icar documentos

Manipulacin de XML desde programas <ava


Analizar XML con )AX
Introduccin a )AX

Hasta a2ora 2emos tra&a$ado slo con el lenguaje XML y algunos de sus lengua$es relacionados ;+T+> )squema XML X!LT<= !iendo estrictos> todava no 2emos programado con XML> es decir> no 2emos reali4ado programas que tra&a$en con XML= La API )AX ; -PI simple para XML< es el primer punto de unin del mundo de XML con el mundo de la programacin en general> y en particular con 3ava= )sta -PI consta de una serie de clases> con sus correspondientes mtodos> que nos permiten tra#ajar con un documento XML desde un programa escrito en 3ava> pudiendo acceder a los datos> compro&ar si est' &ien /ormado> si es v'lido> etc= La principal caracterstica de !-X es que el documento se lee secuencialmente de principio a /in> sin cargar todo el documento en memoria> lo cual tiene consecuencias positivas y negativas8 o La venta$a es la e$iciencia en cuanto al tiempo y la memoria empleados en el an'lisis= o La desventa$a es que con !-X no disponemos de la estructura en 1r#ol de los documentos> luego no podemos modi/icar ni crear documentos XML> ni recorrerlos $er'rquicamente> solamente anali4arlos secuencialmente=

(l analizador )AX

Para poder tra&a$ar con documentos XML mediante !-X necesitamos un analizador )AX= )l anali4ador reali4a el tra&a$o sucio ;detectar cu'ndo empie4a y termina un elemento> gestionar los espacios de nom&res> compro&ar que el documento est' &ien /ormado> etc=<> de /orma que podemos concentrarnos en los aspectos espec/icos de nuestra aplicacin=

)"isten muc7os analizadores en el mercado> pero no todos se pueden utili4ar desde 3ava= Para los e$emplos de este curso utili4aremos el anali4ador Xerces> del proyecto cola&orativo de cdigo a&ierto Apache= Para utili4ar !-X desde un programa escrito en 3ava necesitamos conseguir las clases que componen el anali4ador y asegurarnos de incluir estas clases en la ruta de clases=

3n primer ejemplo

0eamos un primer ejemplo muy sencillo que simplemente anali4a un documento XML e imprime un mensa$e si el documento est' &ien /ormado8
"a,a.io..0E!ception$ or-.!ml.sa!./A>E!ception$ or-.!ml.sa!.>M;7eader$ or-.apache.!erces.parsers./A>:arser$

import import import import

public class /A> V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Anali%ando< ( N fich N (Un(M$ try V >M;7eader parser ' ne5 /A>:arserLM$ parser.parseLfichM$ /ystem.out.printlnL(Iin del anZlisis. 8odo bienUn(M$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W W W

reamos una instancia del analizador ;clase /A>:arser<> que vamos a mane$ar a travs de la inter/a4 >M;7eader= Para analizar el documento llamamos al mtodo parse> pas'ndole el /ic2ero que sea= !i 2ay alg@n pro#lema con el an'lisis se genera una e"cepcin /A>E!ception y el an'lisis se detiene=

(l manejador de contenido

Para que nuestro programa pueda 2acer algo @til con los datos XML seg@n se anali4an> de&emos usar un manejador de contenido= #n mane$ador es una clase con una serie de m todos= )stos mtodos se e$ecutan cuando el anali4ador detecta determinados eventos que se producen al leer un documento ;empie4a el documento> se a&re un elemento> se cierra> se encuentra una instruccin de proceso> etc=<= -*adamos al e$emplo un esqueleto de mane$ador= Los mtodos se rellenar'n con el cdigo apropiado para el programa que estemos reali4ando en cada momento8

class Mane"ador:rueba implements ContentKandler V pri,ate ;ocator loc$ public ,oid setDocument;ocatorL;ocator locM V W public ,oid startDocumentLM W public ,oid endDocumentLM V V

W public ,oid processin-.nstructionL/trin- destino W public ,oid start:refi!Mappin-L/trin- prefi"o W public ,oid end:refi!Mappin-L/trin- prefi"oM V W public ,oid startElementL/trin- espacio /trin- nom;ocal /trin- nomCompleto Attributes atrsM V W public ,oid endElementL/trin- espacio /trin- nom;ocal /trin- nomCompletoM V W public ,oid charactersLcharEF ch W int comien%o int finM V int finM V /trin- datosM V

/trin- uriM V

public ,oid i-norableShitespaceLcharEF ch W public ,oid s[ippedEntityL/trin- nombreM V W

int comien%o

)s necesario a5adir algunas lneas al cdigo anterior para utili4ar el mane$ador8


import import import import import import import "a,a.io..0E!ception$ or-.!ml.sa!./A>E!ception$ or-.!ml.sa!.>M;7eader$ org.xml.sax.Attributes; org.xml.sax.ContentHandler; org.xml.sax.Locator; or-.apache.!erces.parsers./A>:arser$

public class /A> V ... >M;7eader parser ' ne5 /A>:arserLM$ ManejadorPrueba man = new ManejadorPrueba( ; parser.setContentHandler(man ; parser.parseLfichM$ /ystem.out.printlnL(Iin del anZlisis. 8odo bienUn(M$

... W

Los m todos del manejador

-2ora a*adiremos algo de cdigo a los mtodos del mane$ador para ilustrar su $uncionamiento= !implemente escri&iremos mensa$es por la consola cuando se detecten los eventos= )s importante notar que estamos analizando sin validar= M's adelante reali4aremos an'lisis con validacin= )n primer lugar rellenaremos el mtodo setDocument;ocator ;que se e$ecuta al principio del an'lisis< guardando en una varia&le de nuestra clase el localizador que nos llega como par'metro= -s podremos sa&er en qu lugar ;lnea y columna< del /ic2ero ocurren los eventos=

public ,oid setDocument;ocatorL;ocator lM V loc ' l$ /ystem.out.println L(;ocali%ador -uardado(M$ W

)l comienzo y el $inal de un documento implican llamadas a los mtodos startDocument y endDocument8

public ,oid startDocumentLM V /ystem.out.println L(Ahora empie%a el anZlisis...(M$ W public ,oid endDocumentLM V /ystem.out.println L(...Ahora termina el anZlisis(M$ W

)l comienzo y el $inal de cada elemento invocan a los mtodos startElement y endElement> dentro de los cuales tenemos in/ormacin so&re el nom&re del elemento> sus atri&utos y el espacio de nom&res al que pertenece8

public ,oid startElementL/trin- espacio /trin- nom;ocal /trin- nomCompleto Attributes atrsM V /ystem.out.printL(L;*nea ( N loc.-et;ineJumberLM N (M (M$ /ystem.out.printL(/e abre elemento< ( N nom;ocalM$ if L6espacio.eGualsL((MM V /ystem.out.printlnL( en espacio ( N espacio N ( L( N nomCompleto N (M(M$ W else V /ystem.out.printlnL( sin espacio asociado(M$ W for Lint i'0$ i<atrs.-et;en-thLM$ iNNM V /ystem.out.printlnL( Atributo< ( N atrs.-et;ocalJameLiM N ('( N atrs.-et]alueLiMM$ W W public ,oid endElementL/trin- espacio /trin- nom;ocal /trin- nomCompletoM V /ystem.out.printlnL(/e cierra elemento< ( N nom;ocal N (Un(M$ W

La lectura del te2to contenido en cada elemento genera una llamada al mtodo characters> dentro del cual disponemos del te"to en un vector de caracteres acotado con una posicin de comien4o y otra de /in8
int finM V

public ,oid charactersLcharEF ch int comien%o /trin- s ' ne5 /trin-Lch comien%o finM$ /ystem.out.printlnL(Contenido< ( N sM$ W

-lgunas puntuali4aciones so&re este mtodo8 o ?o se puede contar con tener siempre todo el te2to de un elemento en una @nica llamada a este mtodo ;grandes porciones de te"to> te"to y elementos 2i$os se entreme4clan> caracteres especiales> distintos anali4adores> etc=< o Puede recoger los espacios en &lanco al anali4ar sin validacin ;$usto lo que estamos 2aciendo<= Las instrucciones de proceso se controlan mediante el mtodo processin-.nstruction8

public ,oid processin-.nstructionL/trin- destino /trin- datosM V /ystem.out.printlnL(:.< Destino<( N destino N ( Datos<( N datosM$ W

Los dos mtodos que sirven para controlar las declaraciones de espacios de nom#res son start:refi!Mappin- y end:refi!Mappin-= )l primero se e$ecuta al declarar un espacio de nom&res mediante el atri&uto !mlns> mientras que el segundo se e$ecuta al cerrar el elemento en el que se declar el espacio ;normalmente el elemento ra4<8

public ,oid start:refi!Mappin-L/trin- prefi"o /trin- uriM V /ystem.out.printlnL(Comien%a el uso del prefi"o ( N Lprefi"o.eGualsL((M+ (L,ac*oM(< prefi"oM N

( correspondiente a la C7. ( N uriM$

public ,oid end:refi!Mappin-L/trin- prefi"oM V /ystem.out.printlnL(8ermina el uso del prefi"o ( N Lprefi"o.eGualsL((M+ (L,ac*oM(< prefi"oMM$ W

)l mtodo i-norableShitespace lleva control de los espacios en #lanco> aunque con Xerces y la mayora de anali4adores no /unciona &ien si no estamos validando el documento8
int comien%o int finM V

public ,oid i-norableShitespaceLcharEF ch W

Por @ltimo> el mtodo s[ippedEntity tiene lugar en algunos anali4adores que se saltan las entidades cuando no est'n validando> pero es di/cil encontrar casos as8

public ,oid s[ippedEntityL/trin- nombreM V W

-digo porta#le

Hay una /orma me$or de instanciar el analizador> utili4ando la API <AXP> con la que podemos conseguir /'cilmente que nuestros programas que usan !-X /uncionen con cualquier anali4ador sin tener que reali4ar cam&ios en el cdigo> consiguiendo as una completa porta&ilidad8
"a,a.io..0E!ception$ or-.!ml.sa!./A>E!ception$ or-.!ml.sa!.Attributes$ or-.!ml.sa!.;ocator$

import import import import

import ja!ax.xml.parsers."A#Parser; import ja!ax.xml.parsers."A#Parser$actor%; import ja!ax.xml.parsers.ParserCon&iguration'xception; import org.xml.sax.(elpers.)e&aultHandler; public class /A>con=A>: V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Anali%ando< ( N fich N (Un(M$ try V /A>:arser parser$ /A>:arserIactory factoria ' /A>:arserIactory.ne5.nstanceLM$ factoria.setJamespaceA5areLtrueM$ parser ' factoria.ne5/A>:arserLM$ Mane"ador:rueba man ' ne5 Mane"ador:ruebaLM$ parser.parseLfich manM$ /ystem.out.printlnL(Iin del anZlisis. 8odo bienUn(M$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W catch L:arserConfi-urationE!ception eM V /ystem.out.printlnLeM$ W W W W class Mane"ador:rueba e!tends DefaultKandler V

pri,ate ;ocator loc$ public ,oid setDocument;ocatorL;ocator lM V loc ' l$ /ystem.out.println L(;ocali%ador -uardado(M$ W public ,oid startDocumentLM V /ystem.out.println L(Ahora empie%a el anZlisis...(M$ W public ,oid endDocumentLM V /ystem.out.println L(...Ahora termina el anZlisis(M$ W public ,oid processin-.nstructionL/trin- destino /trin- datosM V /ystem.out.printlnL(:.< Destino<( N destino N ( Datos<( N datosM$ W public ,oid start:refi!Mappin-L/trin- prefi"o /trin- uriM V /ystem.out.printlnL(Comien%a el uso del prefi"o ( N Lprefi"o.eGualsL((M+ (L,ac*oM(< prefi"oM N ( correspondiente a la C7. ( N uriM$ W public ,oid end:refi!Mappin-L/trin- prefi"oM V /ystem.out.printlnL(8ermina el uso del prefi"o ( N Lprefi"o.eGualsL((M+ (L,ac*oM(< prefi"oMM$ W public ,oid startElementL/trin- espacio /trin- nom;ocal /trin- nomCompleto Attributes atrsM V /ystem.out.printL(L;*nea ( N loc.-et;ineJumberLM N (M (M$ /ystem.out.printL(/e abre elemento< ( N nom;ocalM$ if L6espacio.eGualsL((MM V /ystem.out.printlnL( en espacio ( N espacio N ( L( N nomCompleto N (M(M$ W else V /ystem.out.printlnL( sin espacio asociado(M$ W for Lint i'0$ i<atrs.-et;en-thLM$ iNNM V /ystem.out.printlnL( Atributo< ( N atrs.-et;ocalJameLiM N ('( N atrs.-et]alueLiMM$ W W public ,oid endElementL/trin- espacio /trin- nom;ocal /trin- nomCompletoM V /ystem.out.printlnL(/e cierra elemento< ( N nom;ocalM$ W public ,oid charactersLcharEF ch int comien%o /trin- s ' ne5 /trin-Lch comien%o finM$ /ystem.out.printlnL(Contenido< ( N sM$ W W int finM V

(&servar que no se 2ace ninguna re$erencia al analizador a utilizar= La independencia se consigue a travs de las clases /A>:arser y /A>:arserIactory> de&indose capturar una :arserConfi-urationE!ception= )l mtodo setJamespaceA5are activa el soporte para espacios de nom#res= on esta solucin> el mane$ador tiene que ser derivado a partir de la clase )e&aultHandler> que es una clase de conveniencia en la que se so&reescri&en slo los mtodos deseados ;sin tener que implementar todos como ocurra con ContentKandler<= (&servar que la /orma de pasar el mane$ador al anali4ador cam&ia=

:alidacin

1alta completar el cdigo para que nuestro programa sea capa4 de validar un documento XML a la ve4 que lo anali4a8

... import or-.!ml.sa!.helpers.DefaultKandler$ import org.xml.sax."A#Parse'xception; ... try V /A>:arser parser$ /A>:arserIactory factoria ' /A>:arserIactory.ne5.nstanceLM$ factoria.setJamespaceA5areLtrueM$ &actoria.set*alidating(true ; parser ' factoria.ne5/A>:arserLM$ Mane"ador:rueba man ' ne5 Mane"ador:ruebaLM$ parser.parseLfich manM$ ... class Mane"ador:rueba e!tends DefaultKandler V ... public ,oid errorL/A>:arseE!ception e!cM thro5s /A>E!ception V /ystem.out.printlnL(``Error``Un( N ( ;*nea< ( N e!c.-et;ineJumberLM N (Un( N ( C7.< ( N e!c.-et/ystem.dLM N (Un( N ( Mensa"e< ( N e!c.-etMessa-eLMM$ thro5 ne5 /A>E!ceptionL(/e encontr? error(M$ W public ,oid fatalErrorL/A>:arseE!ception e!cM thro5s /A>E!ception V /ystem.out.printlnL(``Error Iatal``Un( N ( ;*nea< ( N e!c.-et;ineJumberLM N (Un( N ( C7.< ( N e!c.-et/ystem.dLM N (Un( N ( Mensa"e< ( N e!c.-etMessa-eLMM$ thro5 ne5 /A>E!ceptionL(/e encontr? error fatal(M$

W W

Para in/ormar de los errores que se detecten al validar necesitamos a*adir nuevos m todos al mane$ador= Los errores re$erentes a la validacin provocan una llamada al mtodo error> mientras que los errores que a/ectan a la sinta2is XML invocan al mtodo fatalError= Los errores de validacin no tienen por qu detener el an1lisis> slo lo 2acen si lan4amos una e"cepcin desde el mtodo error= Los errores de sinta"is siempre detienen el an'lisis> lancemos o no una e"cepcin= La validacin se puede reali4ar mediante una 'T' o un esquema XML> seg@n lo que indique el documento XML ;no 2ace /alta cam&iar nada en el cdigo 3ava<=

*tro ejemplo

Para terminar> veamos el cdigo de un manejador para el ejemplo del li#ro que imprime por pantalla el ttulo del li&ro> las lneas del /ic2ero en que empie4a cada captulo> el n@mero de captulos y las materias de las que trata el li&ro8

class Mane"ador;ibro e!tends DefaultKandler V pri,ate ;ocator l$ pri,ate boolean titulo$ pri,ate int numCaps$ pri,ate Kash/et materias$ public ,oid setDocument;ocatorL;ocator lM V this.l ' l$ W public ,oid startDocumentLM V numCaps ' 0$ materias ' ne5 Kash/etLM$ W public ,oid startElementL/trin- espacio /trin- nom;ocal /trin- nomCompleto Attributes atrsM V if Lnom;ocal.eGualsL(8itulo(MM V titulo ' true$ W else if Lnom;ocal.eGualsL(Capitulo(MM V numCapsNN$ /ystem.out.printlnL(Cap*tulo en l*nea< ( Nl.-et;ineJumberLMM$ materias.addLatrs.-et]alueL0MM$ W W public ,oid endElementL/trin- espacio /trin- nom;ocal /trin- nomCompletoM V if Lnom;ocal.eGualsL(8itulo(MM V titulo ' false$ W W public ,oid charactersLcharEF ch int comien%o int finM V if LtituloM V /trin- cad ' ne5 /trin-Lch comien%o finM$ /ystem.out.printlnL(El t*tulo es< ( N cadM$ W W public ,oid endDocumentLM V /ystem.out.printlnL(J_mero de cap*tulos< ( N numCapsM$ /ystem.out.printL(Materias< (M$ .terator i ' materias.iteratorLM$ 5hile Li.hasJe!tLMM V /ystem.out.printLi.ne!tLM N ( (M$ W /ystem.out.printlnLM$ W W

Manipular XML con '*M


Introduccin a '*M

La API '*M ; Modelo de (&$etos de +ocumento< constituye un paso m's all' en el uso de XML desde un lengua$e de programacin> y en particular desde 3ava= )sta -PI tam&in consta de una serie de clases y mtodos> que nos permiten tra&a$ar con los documentos XML desde nuestros programas escritos en 3ava= La principal caracterstica de +(M es que el documento con el que se tra&a$a se carga entero en memoria> en una estructura de 'r&ol> por lo que la /orma de tra&a$ar con +(M es muy distinta a la de !-X8 o La venta$a es que con +(M> al disponer de la estructura del documento> podemos acceder a los datos en /uncin de la $erarqua de elementos> as como modi/icar el contenido de los documentos e incluso crearlos desde cero=

La desventa$a es el coste en tiempo y memoria que conlleva construir el 'r&ol para un documento> so&re todo si tiene cierto tama*o=

(l analizador '*M

Para poder tra&a$ar con +(M necesitamos un analizador '*M= )l anali4ador +(M lee un documento XML y genera una estructura en 'r&ol para l> para lo cual se suele apoyar en un anali4ador !-X= Para los e$emplos de +(M utili4aremos tam&in el anali4ador Xerces ;dado que ya tenemos sus clases y 2emos esta&lecido tam&in la ruta de clases slo tendremos que importar las clases oportunas para tra&a$ar con +(M<

3n primer ejemplo

0eamos un primer ejemplo sencillo que lee un documento XML y genera un 'r&ol para l8
or-.5&c.dom.Document$ "a,a.io..0E!ception$ or-.!ml.sa!./A>E!ception$ or-.apache.!erces.parsers.D0M:arser$

import import import import

public class D0M V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Yenerando Zrbol para< ( N fich N (Un(M$ try V D0M:arser parser ' ne5 D0M:arserLM$ parser.parseLfichM$ Document doc ' parser.-etDocumentLM$ /ystem.out.printlnL(Iin de la car-a. 8odo bienUn(M$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W W W W

?ecesitamos una instancia del analizador ;clase D0M:arser<= 0eremos m's adelante cmo se consigue independencia del anali4ador por medio de la -PI 3-XP= Para generar el 1r#ol llamamos al mtodo parse> pas'ndole el /ic2ero que sea= +espus> con el mtodo -etDocument o&tenemos un o&$eto que re$erencia al 1r#ol creado> y que podemos manipular de m@ltiples /ormas= !i 2ay alg@n pro#lema con la sinta"is del documento XML se genera una e"cepcin /A>E!ception y el proceso se detiene=

Manipulacin del 1r#ol

Para ilustrar el mane$o de +(M vamos a imprimir el documento XML que se nos pase como entrada= Para ello necesitamos reali4ar un procesamiento recursivo8 procesamos cada nodo del 'r&ol y despus procesamos sus nodos 2i$os recursivamente= -*adimos un mtodo tratarJodo que va a ser llamado recursivamente8

import or-.5&c.dom.Document$ import org.w+c.dom.,ode;

import "a,a.io..0E!ception$ ... public class D0M V public static ,oid tratarJodoLJode nodoM V s5itch Lnodo.-etJode8ypeLMM V case Jode.D0CCMEJ8QJ0DE< brea[$ case Jode.E;EMEJ8QJ0DE< brea[$ case Jode.A887.RC8EQJ0DE< brea[$ case Jode.8E>8QJ0DE< brea[$ case Jode.CDA8AQ/EC8.0JQJ0DE< brea[$ case Jode.:70CE//.JYQ.J/87CC8.0JQJ0DE< brea[$ case Jode.EJ8.89Q7EIE7EJCEQJ0DE< brea[$ case Jode.D0CCMEJ8Q89:EQJ0DE< brea[$ W W

public static ,oid mainL/trin-EF ar-sM V ... Document doc ' parser.-etDocumentLM$ tratar,odo(doc ; /ystem.out.printlnL(Iin de la car-a. 8odo bienUn(M$ ... W W

+entro de este mtodo se reali4ar'n tres tareas8 o +eterminar el tipo del nodo en curso= o Imprimir por pantalla el contenido del nodo= o Tratar recursivamente los nodos 7ijos del nodo en curso= La primera tarea se reali4a con el mtodo -etJode8ype> como puede verse en el esquema de cdigo= -2ora completaremos cada caso para reali4ar las otras dos= )l primer nodo que nos encontramos representa todo el documento ;tipo D0CCMEJ8QJ0DE<= -qu imprimiremos la declaracin XML= +espus con -etDocumentElement accedemos al nodo que representa al elemento ra%z> y lo pasamos recursivamente al mtodo tratarJodo8

case Jode.D0CCMEJ8QJ0DE< /ystem.out.printlnL(<!ml ,ersion'U(1.0U(>(M$ Document doc ' LDocumentMnodo$ tratarJodoLdoc.-etDocumentElementLMM$ brea[$

Los elementos del documento est'n representados por un nodo E;EMEJ8QJ0DE= (&tenemos el nom#re de cada elemento con -etJodeJame= on -etChildJodes o&tenemos los 7ijos en una Jode;ist> que 2ay que recorrer para tratar recursivamente cada 2i$o=
or-.5&c.dom.Document$ or-.5&c.dom.Jode$ org.w+c.dom.,odeList; "a,a.io..0E!ception$

import import import import

... case Jode.E;EMEJ8QJ0DE< /trin- nombre ' nodo.-etJodeJameLM$ /ystem.out.printL(<( N nombreM$ /ystem.out.printlnL(>(M$ Jode;ist hi"os ' nodo.-etChildJodesLM$ if Lhi"os 6' nullM V for Lint i'0$ i<hi"os.-et;en-thLM$ iNNM V tratarJodoLhi"os.itemLiMM$ W W /ystem.out.printlnL(</( N nombre N (>(M$ brea[$

Para o&tener los atri#utos de un elemento tenemos el mtodo -etAttributes> que devuelve un JamedJodeMap> el cual procesamos para tratar los atri&utos recursivamente= ada atri&uto es un nodo A887.RC8EQJ0DE> cuyo nom&re y valor recuperamos con -etJodeJame y
-etJode]alue8 import import import import import ... or-.5&c.dom.Document$ or-.5&c.dom.Jode$ or-.5&c.dom.Jode;ist$ org.w+c.dom.,amed,odeMap; "a,a.io..0E!ception$

case Jode.E;EMEJ8QJ0DE< /trin- nombre ' nodo.-etJodeJameLM$ /ystem.out.printL(<( N nombreM$ ,amed,odeMap ats = nodo.getAttributes( ; &or (int i=-; i.ats.getLengt(( ; i// 0 tratar,odo(ats.item(i ; 1 /ystem.out.printlnL(>(M$ Jode;ist hi"os ' nodo.-etChildJodesLM$ ... brea[$ case Jode.A887.RC8EQJ0DE< /ystem.out.printL( ( N nodo.-etJodeJameLM N ('U(( N nodo.-etJode]alueLM N (U((M$

Para que la salida sea m1s $1cil de leer colocamos un sangrado que vamos aumentando recursivamente8

public static ,oid tratarJodoLJode nodo "tring indM V s5itch Lnodo.-etJode8ypeLMM V case Jode.D0CCMEJ8QJ0DE< /ystem.out.printlnL(<!ml ,ersion'U(1.0U(>(M$ Document doc ' LDocumentMnodo$ tratarJodoLdoc.-etDocumentElementLM ((M$ brea[$ case Jode.E;EMEJ8QJ0DE< /trin- nombre ' nodo.-etJodeJameLM$ /ystem.out.printLind N (<( N nombreM$ JamedJodeMap ats ' nodo.-etAttributesLM$ for Lint i'0$ i<ats.-et;en-thLM$ iNNM V tratarJodoLats.itemLiM ((M$ W /ystem.out.printlnL(>(M$ Jode;ist hi"os ' nodo.-etChildJodesLM$ if Lhi"os 6' nullM V for Lint i'0$ i<hi"os.-et;en-thLM$ iNNM V tratarJodoLhi"os.itemLiM ind N ( (M$ W

W /ystem.out.printlnLind N (</( N nombre N (>(M$ brea[$ ... public static ,oid mainL/trin-EF ar-sM V ... Document doc ' parser.-etDocumentLM$ tratar,odo(doc2 33 ; /ystem.out.printlnL(Iin de la car-a. 8odo bienUn(M$ ...

)l te2to de los elementos viene recogido en nodos 8E>8QJ0DE o CDA8AQ/EC8.0JQJ0DE> en los cuales slo tenemos que 2acer una llamada a -etJode]alue para o&tener el te"to8

case Jode.8E>8QJ0DE< /trin- te!to ' nodo.-etJode]alueLM.trimLM$ if L6te!to.eGualsL((MM V /ystem.out.printlnLind N te!toM$ W brea[$ case Jode.CDA8AQ/EC8.0JQJ0DE< /ystem.out.printlnLnodo.-etJode]alueLMM$ brea[$

!lo nos /altan unos /ltimos detalles8 el cdigo para procesar las instrucciones de proceso> la declaracin +T+ y las re/erencias a entidades8
or-.5&c.dom.Document$ or-.5&c.dom.Jode$ or-.5&c.dom.Jode;ist$ or-.5&c.dom.JamedJodeMap$ org.w+c.dom.)ocument4%pe; "a,a.io..0E!ception$

import import import import import import ...

case Jode.:70CE//.JYQ.J/87CC8.0JQJ0DE< /ystem.out.printlnL(<+( N nodo.-etJodeJameLM N ( ( N nodo.-etJode]alueLM N (+>(M$ brea[$ case Jode.D0CCMEJ8Q89:EQJ0DE< Document8ype dt ' LDocument8ypeMnodo$ /ystem.out.printlnL(<6D0C89:E ( N dt.-etJameLM N ( /9/8EM U(( N dt.-et/ystem.dLM N (U(>(M$ brea[$ case Jode.EJ8.89Q7EIE7EJCEQJ0DE< /ystem.out.printlnLind N (#( N nodo.-etJodeJameLM N ($(M$ brea[$

. modi$icar el tratamiento del nodo del documento para que trate todos sus nodos 2i$os> ya que las instrucciones de proceso y la declaracin +T+ lo son8

case Jode.D0CCMEJ8QJ0DE< /ystem.out.printlnL(<!ml ,ersion'U(1.0U(>(M$ Document doc ' LDocumentMnodo$ tratarJodoLdoc.-etDocumentElementLM ((M$ ,odeList nodos = nodo.getC(ild,odes( ; i& (nodos 5= null 0 &or (int i=-; i.nodos.getLengt(( ; i// 0 tratar,odo(nodos.item(i 2 33 ; 1 1 brea[$

-digo porta#le

...

Podemos utili4ar la -PI 3-XP para conseguir independencia del anali4ador> de una /orma an'loga a como lo 2icimos con !-X8

import ja!ax.xml.parsers.)ocument6uilder; import ja!ax.xml.parsers.)ocument6uilder$actor%; import ja!ax.xml.parsers.ParserCon&iguration'xception; public class D0Mcon=A>: V ... public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Yenerando Zrbol para< ( N fich N (Un(M$ try V )ocument6uilder parser; )ocument6uilder$actor% &actoria = )ocument6uilder$actor%.new7nstance( ; parser = &actoria.new)ocument6uilder( ; )ocument doc = parser.parse(&ic( ; tratarJodoLdoc ((M$ /ystem.out.printlnL(Iin de la car-a. 8odo bienUn(M$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W catch L:arserConfi-urationE!ception eM V /ystem.out.printlnLeM$ W W W W

*tro ejemplo

(jemplo '*M para el documento del li#ro= Imprime por pantalla el ttulo del li&ro> el n@mero de captulos y las materias de las que trata el li&ro8
or-.5&c.dom.Document$ or-.5&c.dom.Jode$ or-.5&c.dom.Jode;ist$ or-.5&c.dom.JamedJodeMap$ "a,a.io..0E!ception$ or-.!ml.sa!./A>E!ception$

import import import import import import

import "a,a!.!ml.parsers.DocumentRuilder$ import "a,a!.!ml.parsers.DocumentRuilderIactory$ import "a,a!.!ml.parsers.:arserConfi-urationE!ception$ import "a,a.util.Kash/et$ import "a,a.util..terator$ public class E"emploD0M V static int numCaps ' 0$ static Kash/et materias ' ne5 Kash/etLM$

public static ,oid procesarLJode nodoM V /trin- nombre ' nodo.-etJodeJameLM$ if Lnombre.eGualsL(;ibro(MM V Jode;ist hi"os ' nodo.-etChildJodesLM$ for Lint i'0$ i<hi"os.-et;en-thLM$ iNNM V procesarLhi"os.itemLiMM$ W /ystem.out.printlnL(Jum Cap*tulos< ( N numCapsM$ /ystem.out.printL(Materias< (M$ .terator i ' materias.iteratorLM$ 5hile Li.hasJe!tLMM V /ystem.out.printLi.ne!tLM N ( (M$ W /ystem.out.printlnLM$ W else if Lnombre.eGualsL(Contenido(MM V Jode;ist hi"os ' nodo.-etChildJodesLM$ for Lint i'0$ i<hi"os.-et;en-thLM$ iNNM V procesarLhi"os.itemLiMM$ W W else if Lnombre.eGualsL(8itulo(MM V Jode;ist hi"os ' nodo.-etChildJodesLM$ /ystem.out.printlnL(8*tulo< ( N hi"os.itemL0M.-etJode]alueLMM$ W else if Lnombre.eGualsL(Capitulo(MM V numCapsNN$ JamedJodeMap ats ' nodo.-etAttributesLM$ materias.addLats.itemL0M.-etJode]alueLMM$ W W

public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Yenerando Zrbol para< ( N fich N (Un(M$ try V DocumentRuilder parser$ DocumentRuilderIactory factoria ' DocumentRuilderIactory.ne5.nstanceLM$ parser ' factoria.ne5DocumentRuilderLM$ Document doc ' parser.parseLfichM$ procesarLdoc.-etDocumentElementLMM$ /ystem.out.printlnL(Iin. 8odo bienUn(M$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W catch L:arserConfi-urationE!ception eM V /ystem.out.printlnLeM$ W

W W W

M1s $ormas de manipular el 1r#ol

asi todos los m todos que 7emos visto para tra&a$ar con +(M est'n de/inidos en la inter/a4
Jode=

)"isten un par de m todos muy /tiles de/inidos en la inter/a4 Element> que 2ereda de Jode8

Para recuperar una serie de elementos por su nom#re6 no necesariamente 7ijos directos> tenemos -etElementsRy8a-Jame> que devuelve una Jode;ist= )ste mtodo tam&in est' de/inido en la inter/a4 Document= o Para recuperar el valor de un atri#uto a partir de su nom#re> tenemos -etAttribute= M's mtodos @tiles> stos otra ve4 en la inter/a4 ?ode8 o Para e"traer el primer 2i$o de un nodo> -etIirstChild= )s muy @til para conseguir el te2to de un elemento= o Para e"traer el padre de un nodo> -et:arentJode= Ilustraremos estos mtodos con un peque5o programa ejemplo que muestra por pantalla todas las secciones de un li&ro> con su n@mero de apartados y captulo al que pertenecen8
or-.5&c.dom.Document$ or-.5&c.dom.Jode;ist$ or-.5&c.dom.Jode$ or-.5&c.dom.Element$ "a,a.io..0E!ception$ or-.!ml.sa!./A>E!ception$ "a,a!.!ml.parsers.DocumentRuilder$ "a,a!.!ml.parsers.DocumentRuilderIactory$ "a,a!.!ml.parsers.:arserConfi-urationE!ception$

import import import import import import import import import

public class :eGE"emploD0M V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Yenerando Zrbol para< ( N fich N (Un(M$ try V DocumentRuilder parser$ DocumentRuilderIactory factoria ' DocumentRuilderIactory.ne5.nstanceLM$ parser ' factoria.ne5DocumentRuilderLM$ Document doc ' parser.parseLfichM$ Jode;ist secciones ' doc.-etElementsRy8a-JameL(/eccion(M$ for Lint i'0$ i<secciones.-et;en-thLM$ iNNM V Element sec ' LElementMsecciones.itemLiM$ /ystem.out.printLsec.-etIirstChildLM.-etJode]alueLMM$ /ystem.out.printL( L( N sec.-etAttributeL(apartados(M N ( (M$ Element padre ' LElementMsec.-et:arentJodeLM$ Jode tema ' padre.-etElementsRy8a-JameL(8ema(M.itemL0M$ /ystem.out.printlnLtema.-etIirstChildLM.-etJode]alueLM N (M(M$ W W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W catch L:arserConfi-urationE!ception eM V /ystem.out.printlnLeM$ W

W W W

(&servar que reali4ar el mismo programa mediante )AX sera un poco engorroso=

-rear documentos

?os queda pendiente crear un documento desde cero con +(M=

-l no estar estandarizada esta tarea> los detalles concretos dependen del anali4ador que se utilice= Primeramente necesitamos instanciar una
clase concreta

que implemente el inter/a4 Document= )n el caso de Xerces es Document.mpl=

Los m todos m's importantes para ir componiendo el documento son8 o createElement crea un nodo para un elemento ;Inter/a4 Document<= o setAttribute crea un atri#uto para un elemento ;Inter/a4 Element<= o create8e!tJode crea un nodo de tipo te2to ;Inter/a4 Document<= o appendChild sirve para agregar un nodo 7ijo a un nodo padre> al /inal de su lista de nodos 2i$os ;Inter/a4 Jode<= o )"isten otros mtodos de/inidos en Document que crean otros tipos de nodos> como instrucciones de proceso> secciones +-T- o re/erencias a entidad=

Imprimir documentos

#na ve4 que 2emos creado el documento> podemos imprimirlo en un $lujo ;por pantalla> a un /ic2ero> etc=<= -l no estar estandarizada esta tarea> los detalles concretos dependen del anali4ador que se utilice= )n el caso de Xerces> necesitamos instanciar la clase >M;/eriali%er> especi/icando el /lu$o por el que vamos a escri&ir y un /ormato= +espus pasamos nuestro documento al mtodo seriali%e=

3n ejemplo

)n el siguiente e$emplo crearemos un peque5o documento con los datos de una persona y lo imprimiremos por pantalla y a un /ic2ero=
"a,a.io..0E!ception$ "a,a.io./trin-Sriter$ "a,a.io.IileSriter$ or-.5&c.dom.Document$ or-.5&c.dom.Element$ or-.5&c.dom.:rocessin-.nstruction$ or-.apache.!erces.dom.Document.mpl$ or-.apache.!ml.seriali%e.0utputIormat$ or-.apache.!ml.seriali%e./eriali%er$ or-.apache.!ml.seriali%e./eriali%erIactory$ or-.apache.!ml.seriali%e.>M;/eriali%er$

import import import import import import import import import import import

public class CrearD0M V public static ,oid mainL /trin-EF ar-, M V try V Document doc' ne5 Document.mplLM$ Element rai% ' doc.createElementL(:ersona(M$ rai%.setAttributeL(DJ.( (1)&43D@(M$ Element elem ' doc.createElementL(Jombre(M$ elem.appendChildLdoc.create8e!tJodeL(=uan :Bre%(MM$ rai%.appendChildLelemM$ elem ' doc.createElementL(Edad(M$ elem.appendChildLdoc.create8e!tJodeL()2(MM$ rai%.appendChildLelemM$ elem ' doc.createElementL(Altura(M$ elem.appendChildLdoc.create8e!tJodeL(1.@3(MM$ rai%.appendChildLelemM$ elem ' doc.createElementL(Direcci?n(M$ Element elemKi"o ' doc.createElementL(Calle(M$ elemKi"o.appendChildLdoc.create8e!tJodeL(Castellana(MM$ elem.appendChildLelemKi"oM$ elemKi"o ' doc.createElementL(J_mero(M$

elemKi"o.appendChildLdoc.create8e!tJodeL(133(MM$ elem.appendChildLelemKi"oM$ rai%.appendChildLelemM$ :rocessin-.nstruction pi ' doc.create:rocessin-.nstructionL(mi:.( (atr'U(pruebaU((M$ doc.appendChildLpiM$ doc.appendChildLrai%M$ 0utputIormat formato ' ne5 0utputIormatLdoc (C8I12( /trin-Sriter s ' ne5 /trin-SriterLM$ >M;/eriali%er ser ' ne5 >M;/eriali%erLs formatoM$ ser.seriali%eLdocM$ /ystem.out.printlnLs.to/trin-LMM$ IileSriter f ' ne5 IileSriterL(persona.!ml(M$ ser ' ne5 >M;/eriali%erLf formatoM$ ser.seriali%eLdocM$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W trueM$

W W

Modi$icar documentos

Tam&in podemos modi$icar un documento +(M por medio de los siguientes mtodos de/inidos en Jode8 o insertRefore agrega un nodo 2i$o a otro nodo> permitiendo especi/icar la posicin concreta en la lista de 2i$os ;el 2i$o que va a quedar detr's del nuevo<= o remo,eChild elimina un nodo 2i$o= o replaceChild reemplaza un nodo 2i$o por otro= o remo,eAttribute elimina un atri#uto de un nodo ;este mtodo se de/ine en )lement<=

Apuntes de XML
Autor: Diego Arranz Hernando

XML y las &ases de datos o 5enerar XML a partir de consultas o Trans/erir datos desde documentos XML o Herramientas o XML como almacn de datos

XML y las #ases de datos


>enerar XML a partir de consultas

Para generar XML a partir de datos almacenados en una &ase de datos> es necesario llevar a ca&o dos tareas8 o )$ecutar 2acia la &ase de datos la consulta deseada= o -onstruir un documento XML a partir de los datos o&tenidos por la consulta= La /orma m's cmoda de 2acer esto es por medio de '*M= 0eamos un e$emplo que ilustra esto8
"a,a.io.`$ "a,a.sGl.`$ or-.5&c.dom.`$ or-.apache.!erces.dom.Document.mpl$ or-.apache.!ml.seriali%e.`$

import import import import import

class RD8o>M; V public static ,oid mainL/trin- ar-sEFM V tryV Class.forJameL(com.inet.tds.8dsDri,er(M$ /trin- url ' ("dbc<inetdae@<localhost+database'Jorth5ind($ Connection con ' Dri,erMana-er.-etConnectionLurl (sa( ((M$ /tatement st ' con.create/tatementLM$ /trin- sGl ' (/E;EC8 ` I70M CC/80ME7/($ 7esult/et res ' st.e!ecuteAueryLsGlM$ Document doc ' ne5 Document.mplLM$ Element rai% ' doc.createElementL(7esultado(M$ 7esult/etMetaData rMeta ' res.-etMetaDataLM$ int nCols ' rMeta.-etColumnCountLM$ 5hile Lres.ne!tLMM V Element re- ' doc.createElementL(Elemento(M$ re-.setAttributeLrMeta.-etColumnJameL1M res.-et/trin-L1MM$ forLint i')$ i<'nCols$ iNNM V Element campo ' doc.createElementLrMeta.-etColumnJameLiMM$ campo.appendChildLdoc.create8e!tJodeLres.-et/trin-LiMMM$ re-.appendChildLcampoM$ W rai%.appendChildLre-M$ W doc.appendChildLrai%M$ con.closeLM$ 0utputIormat formato ' ne5 0utputIormatLdoc (C8I12( /trin-Sriter s ' ne5 /trin-SriterLM$ >M;/eriali%er ser ' ne5 >M;/eriali%erLs formatoM$ ser.seriali%eLdocM$ /ystem.out.printlnLs.to/trin-LMM$ W catchLClassJotIoundE!ception e!MV /ystem.out.printlnLe!M$ trueM$

W W

W catchL/A;E!ception e!MV /ystem.out.printlnLe!M$ W catchL.0E!ception e!MV /ystem.out.printlnLe!M$ W

La primera parte del cdigo ejecuta la consulta deseada y o&tiene los resultados en un o&$eto de la clase 7esult/et= Para ello es necesario previamente cargar un controlador y especi$icar una 3,L acordes con la :+ que se desee utili4ar= )stas instrucciones y otras que siguen corresponden a la -PI <'0-> cuyos detalles est'n m's all' del alcance de este curso= +espus se trata de trans$erir los datos del o&$eto 7esult/et a un 'r&ol +(M= )n este ejemplo concreto cada registro de los resultados se convierte en un elemento XML= )l primer campo se convierte en un atri&uto y el resto en su&elementos= #na ve4 creado el 'r&ol +(M> imprimimos el documento XML por pantalla> aunque /'cilmente se podra llevar a un /ic2ero o reali4ar alguna otra accin=

Trans$erir datos desde documentos XML



)l paso de datos en XML a una &ase de datos es un poco m's engorroso= !e trata de construir y ejecutar una serie de sentencias )?L de insercin a partir de los datos contenidos en el documento XML= 0eamos los detalles de esta tarea con un ejemplo8
"a,a.io.`$ "a,a.sGl.`$ or-.5&c.dom.`$ or-.!ml.sa!./A>E!ception$ "a,a!.!ml.parsers.DocumentRuilder$ "a,a!.!ml.parsers.DocumentRuilderIactory$ "a,a!.!ml.parsers.:arserConfi-urationE!ception$

import import import import import import import

class >M;8oRD V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Yenerando Zrbol para< ( N fich N (Un(M$ try V Class.forJameL(com.inet.tds.8dsDri,er(M$ /trin- url ' ("dbc<inetdae@<localhost+database'Jorth5ind($ Connection con ' Dri,erMana-er.-etConnectionLurl (sa( ((M$ /tatement st ' con.create/tatementLM$ DocumentRuilder parser$ DocumentRuilderIactory factoria ' DocumentRuilderIactory.ne5.nstanceLM$ parser ' factoria.ne5DocumentRuilderLM$ Document doc ' parser.parseLfichM$ Element rai% ' doc.-etDocumentElementLM$ /trin- tabla ' rai%.-etJodeJameLM$ /trin- sGlIi"a ' (.J/E78 .J80 ( N tabla N (L($ /trin- nombre ' tabla.substrin-L0 tabla.len-thLM 1 1M$ Jode;ist elems ' rai%.-etElementsRy8a-JameLnombreM$ Jode primero ' elems.itemL0M$ Jode;ist campos ' primero.-etChildJodesLM$ for Lint i'0$ i<campos.-et;en-thLM$ iNNM V

Jode n ' campos.itemLiM$ if Ln.-etJode8ypeLM '' Jode.E;EMEJ8QJ0DEM V sGlIi"a N' LLi''1M+ (( < ( (M N n.-etJodeJameLM$ W W sGlIi"a N' (M ]A;CE/ ($ for Lint i'0$ i<elems.-et;en-thLM$ iNNM V /trin- sGl]ar ' (L($ Jode n ' elems.itemLiM$ Jode;ist hi"os ' n.-etChildJodesLM$ for Lint "'0$ "<hi"os.-et;en-thLM$ "NNM V Jode hi"o ' hi"os.itemL"M$ if Lhi"o.-etJode8ypeLM '' Jode.E;EMEJ8QJ0DEM V sGl]ar N' LL"''1M+ (^( < ( ^(M N hi"o.-etIirstChildLM.-etJode]alueLM N (^($ W W sGl]ar N' (M($ st.e!ecuteCpdateLsGlIi"a N sGl]arM$ /ystem.out.printlnLsGlIi"aM$ /ystem.out.printlnLsGl]arM$ /ystem.out.printlnLM$ W W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W catch L:arserConfi-urationE!ception eM V /ystem.out.printlnLeM$ W catchLClassJotIoundE!ception e!MV /ystem.out.printlnLe!M$ W catchL/A;E!ception e!MV /ystem.out.printlnLe!M$ W

W W W

)n la primera parte se reali4a la cone2in con la 0' y se de$a preparado un o&$eto /tatement que nos servir' para e$ecutar las sentencias de insercin= Posteriormente o&tenemos el 1r#ol '*M para el documento XML de origen= - partir del elemento ra4 y el primer su&elemento de ste> construmos la primera parte del )?L necesario para reali4ar inserciones de registros= )sta parte ser' /i$a para todas las inserciones> y contiene el nom#re de la ta#la y los nom#res de sus campos= +espus> para cada elemento del documento XML que cuelgue del elemento ra4 completamos la sentencia de insercin con los valores contenidos en el elemento y ejecutamos la sentencia= )n este e$emplo concreto se 2a supuesto que el nom&re del elemento ra%z coincide con la ta#la destino y que los elementos que cuelgan del ra4 se nom&ran con el singular del elemento ra4=

Herramientas

Hemos visto e$emplos de la programacin del proceso de conversin XML :+ en am&os sentidos> por medio de las -PIs '*M y <'0-= )"isten APIs de m1s alto nivel que nos ayudan en la programacin de ese proceso= Tam&in e"isten multitud de productos que nos proporcionan autom'ticamente esa conversin mediante un inter$az visual= ada /orma de reali4ar la conversin tiene su punto /uerte8

o o

La programacin nos proporciona un completo control so&re el proceso de trans/ormacin y es v'lida en mayor n@mero de circunstancias> a costa de un mayor tra&a$o= Las 7erramientas autom1ticas $acilitan muc7o el tra#ajo> a costa de menos control en el proceso y menor rango de situaciones de uso=

XML como almac n de datos



Hemos visto ampliamente cmo XML es un /ormato totalmente orientado 7acia los datos= 0imos en la introduccin que uno de los usos de XML es la con$iguracin= Hay e$emplos reales &astante importantes de este uso> como los descriptores para )3:s> o la con/iguracin del servidor de servlets Apache Tomcat= Lo siguiente es preguntarnos si podramos llegar a tener como #ase de datos un sistema que /uncione e"clusivamente con XML= +ic2o sistema nos a7orrar%a las conversiones que 2emos anali4ado en los apartados anteriores> ganando principalmente en rapidez= Hay una serie de pro#lemas que van en contra> al menos a corto pla4o> de esta posi&ilidad8 o Multitud de aplicaciones ;por no decir casi todas< que utili4an actualmente alg@n sistema de #ases de datos relacionales ;(racle> !SL !erver> !y&ase> My!SL> etc=<= o Tama5o de las &ases de datos necesarias= o ,epresentacin en XML de datos relaciones= +e todas /ormas> ya e2isten multitud de sistemas de ::++ que /uncionan e"clusivamente con XML y que pueden ser v'lidos en determinadas circunstancias ;peque*as cantidades de datos> sistemas no 2eredados> etc=<=

Apuntes de XML
Autor: Diego Arranz Hernando

(tros temas de inters o XLin6 o 3+(M (tra -PI m's 0enta$as y desventa$as #na -PI en desarrollo o Marcos de pu&licacin 7e& )l pro&lema !oluciones con tecnologa conocida ontenido y presentacin La solucin8 marcos de pu&licacin 7e& 0enta$as #n e$emplo de marco de pu&licacin8 ocoon

*tros temas de inter s


XLin@

)s un lengua$e XML que nos permite especi/icar enlaces entre documentos XML= (/rece muc2as m1s posi#ilidades de enlace que el elemento <a href'...> ... </a> recogido en el est'ndar HTML= 0eamos un e$emplo de cdigo8

<en,ironment !mlns<!lin['(http<//555.5&.or-/1444/!lin[( !lin[<type'(e!tended(> <artist !lin[<type'(locator( !lin[<label'(artist( !lin[<href'(modi-liani.!ml(/> <influence !lin[<type'(locator( !lin[<label'(inspiration( !lin[<href'(ce%anne.!ml(/> <influence !lin[<type'(locator( !lin[<label'(inspiration( !lin[<href'(lautrec.!ml(/> <influence !lin[<type'(locator( !lin[<label'(inspiration( !lin[<href'(rouault.!ml(/> <history !lin[<type'(locator( !lin[<label'(period( !lin[<href'(paris.!ml(/> <history !lin[<type'(locator( !lin[<label'(period( !lin[<href'([islin-.!ml(/> <bind !lin[<type'(arc( !lin[<from'(artist( !lin[<to'(inspiration(/> <bind !lin[<type'(arc( !lin[<from'(artist( !lin[<to'(period(/> </en,ironment>

)n XLin6 e"isten dos tipos de enlaces8 simples ;como los elementos a im- de HTML< y e"tendidos= Los recursos y enlaces se representan con elementos> pudiendo elegir li&remente el nom&re de los mismos= Para recursos e2ternos se usa el tipo locator> para recursos internos resource= Para especi/icar /inalmente los enlaces se usa el tipo arc= omo se puede o&servar> la caracterstica m's atractiva de XLin6 es que podemos tener enlaces m/ltiples= )"iste un lengua$e complementario> Xpointer ;&asado en Xpat2<> que permite reali4ar enlaces a partes de un documento o incluso a elementos individuales= Para que XLin6 y Xpointer sean realmente @tiles se de&en ir implementando progresivamente en los navegadores=

<'*M

*tra API m1s

)s otra -PI para manipular documentos XML> pero slo desde programas escritos en 3ava= Pretende ser una alternativa a la API '*M> con las siguientes caractersticas principales8 o M's $1cil de usar= o M's adecuada a <ava= o M's r1pida= o Independiente de cualquier anali4ador ;recordar pro&lemas con la creacin y seriali4acin de documentos<= o Sue se integre &ien con !-X y +(M= - continuacin se muestra un ejemplo que e"trae el ttulo y los captulos del documento del li&ro> utili4ando para ello 3+(M8
"a,a.io.Iile$ "a,a.util.;ist$ or-."dom.input.D0MRuilder$ or-."dom.`$

import import import import

public class :eGE"emplo V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Yenerando Zrbol para< ( N fich N (Un(M$ try V D0MRuilder b ' ne5 D0MRuilderL(or-."dom.adapters.>ercesD0MAdapter(M$ Document doc ' b.buildLne5 IileLfichMM$ Element rai% ' doc.-et7ootElementLM$ Jamespace ns ' Jamespace.-etJamespace L(http<//555.mislibros.com/libros/"a,a!ml(M$ Element tit ' rai%.-etChildL(8itulo( nsM$ /ystem.out.printlnLtit.-et8e!tLM N (Un(M$ Element cont ' rai%.-etChildL(Contenido( nsM$ ;ist caps ' cont.-etChildrenL(Capitulo( nsM$ for Lint i'0$ i<caps.si%eLM$ iNNM V Element cap ' LElementMcaps.-etLiM$ /ystem.out.printlnLcap.-etChild8e!tL(8ema( nsMM$ W W catch L=D0ME!ception eM V /ystem.out.printlnLeM$ W W W

:entajas y desventajas

omo aspectos positivos de 3+(M> a modo de e$emplo> se pueden o&servar los siguientes> que /acilitan el tra&a$o con los documentos XML8 o )l mtodo -et8e!tLM devuelve directamente el te"to contenido en un elemento> mientras que la /orma m's simple de 2acerlo con +(M sera -etIirstChildLM.-etJode]alueLM= o (tro mtodo muy @til es -etChild8e!tLM> que devuelve el te2to de un 7ijo= )sta misma tarea con +(M requerira &astante m's cdigo= o !e utili4an clases est1ndar del estilo ;ist y Map> incluidas en 3ava desde su versin K=T> en lugar de las clases Jode;ist y JamedJodeMap que vienen con +(M= o )"isten una serie de adaptadores que permiten construir un documento especi/icando un determinado anali4ador> pero sin necesidad de importar e2pl%citamente la clase necesaria ;porta&ilidad<= )n cuanto a los aspectos negativos de 3+(M> tam&in a modo de e$emplo8 o ?o e"iste un mtodo equivalente al muy @til -etElementsRy8a-Jame que con +(M nos permita o&tener elementos de cualquier nivel por de&a$o del actual=

)s necesario especi/icar el espacio de nom#res> incluso cuando se tra&a$a sin pre/i$o alguno=

3na API en desarrollo

+e cualquier /orma> la -PI 3+(M todava se encuentra en $ase #eta> por lo que es previsi&le que cam&ie algo 2asta la /inali4acin de la versin K=M= -ctualmente $orma parte del <-P ;3ava ommunity Process< mediante una 3!% ;3ava !peci/ication %equest<> por lo que seguramente /ormar' parte de una versin /utura del 3+P=

Marcos de pu#licacin "e#


(l pro#lema

Imaginemos un gran sitio "e# /ormado por decenas o incluso cientos de p'ginas HTML= !e desea permitir un acceso m/ltiple al contenido a travs de un navegador o a travs de mviles Q-P ;sin descartar m's /ormas de acceso en el /uturo<> e incluso que se puedan imprimir los contenidos con calidad utili4ando un /ormato como P+1= Tam&in es desea&le que se pueda reali4ar sin demasiada di/icultad un completo cam#io de imagen en todo el sitio 7e&=

)oluciones con tecnolog%a conocida

Las 7ojas de estilo en cascada ; !!< pueden ayudar un poco en esta tarea> pero no lo su/iciente= on un sistema &asado en <ava )ervlets se de&era cam&iar el cdigo de stos> e incluso a*adir m's servlets> con las consiguientes recompilaciones> con/iguraciones y riesgos para el /uncionamiento del sistema= #na solucin &astante &uena es el uso de p'ginas <)P> so&re todo si se com&ina con el uso de &eans y li&reras de etiquetas=

-ontenido y presentacin

+e lo que se trata en el /ondo es de 2allar la me$or /orma de separar contenido y presentacin= Por un lado tendramos el contenido> los datos> y por otro lado distintas vistas o /ormas de presentar los datos= +e esta /orma un cam#io de imagen slo a/ecta a una o varias vistas= La necesidad de mostrar los datos en otro $ormato slo implica la creacin de otra vista=

La solucin& marcos de pu#licacin "e#

#n marco de pu#licacin es un sistema que sirve contenido 7e& aplicando los principios de la separacin entre contenido y presentacin que 2emos visto= Para el contenido se utili4a XML y para la presentacin X)L ;tanto X!LT como X!L91(<= M's en detalle> un marco de pu&licacin 7e& XMLOX!L es un sistema que8 o Admite peticiones de documentos en diversos /ormatos= o (&tiene la in/ormacin adecuada de las posi&les $uentes de datos XML= o (&tiene la in/ormacin so&re las trans$ormaciones X)L necesarias y se las aplica a los datos= o 1ormatea el resultado /inal y lo sirve como respuesta a la peticin inicial=

:entajas

!eparacin limpia entre contenido y presentacin ;que lleva consigo la separacin clara entre distintos roles de tra&a$o<= Proporciona una me$ora muy nota&le del mantenimiento8 se puede reali4ar un cam&io radical de imagen de todo un site 7e& con tan solo modi/icar las 2o$as X!L y sin tocar ni una sola lnea de cdigo=

- partir de un solo documento XML con el contenido> se pueden o&tener p'ginas HTML para su presentacin 7e&> p'ginas QML para dispositivos Q-P> documentos P+1 para imprimir> etc= -unque no 2ay ning@n est'ndar que regule cmo de&e ser un sistema de pu&licacin> si que est' #asado en est1ndares con muc7a $uerza en el mercado> por lo que es m's sencillo pasar de usar uno a usar otro= )s compati#le con el resto de tecnologas 7e& como servlets> 3!Ps===

3n ejemplo de marco de pu#licacin& -ocoon

La principal desventa$a de estos sistemas es la poca madurez de la mayora= )l m1s maduro y reconocido en este momento es Cocoon> cuya versin T=M ya se encuentra disponi&le> con muc2as me$oras en cuanto a /acilidad de uso y e/iciencia so&re la serie K="= 0eamos algunas de sus caractersticas8 o 1orma parte del proyecto cola&orativo de cdigo a#ierto Apache= o )s altamente con$igura#le= Por e$emplo> podemos elegir el anali4ador XML y el procesador X!LT que m's nos gusten= o Permite di$erenciar el procesado del documento en /uncin del dispositivo o tipo de so/t7are que reali4a la peticin= o Incorpora un sistema de cac7 que permite un rendimiento muy elevado= o Puede tra&a$ar como un programa en lnea de comandos pero su uso normal es como un sistema de servlets para la pu#licacin a travs de la Qe&= o Incorpora las p1ginas X)P> que son documentos XML que aparte de contenido est'tico incluyen lgica para crear XML din'micamente= !on parecidas a las p'ginas 3!P> pero pretenden solucionar algunos pro&lemas de stas=

Apuntes de XML
Autor: Diego Arranz Hernando

!ervicios 7e& o Introduccin o Terminologa Tecnologas est'ndar -PIs 3ava o 3-X% %egistros Introduccin a 3-X% #n cliente 3-X% o 3-XM Mensa$es !(-P Introduccin a 3-XM )$emplos o 3-X9%P Introduccin #n e$emplo

)ervicios "e#
Introduccin

0eamos una de$inicin $ormal de un servicio 7e&8 E-plicacin modular> auto9contenida y auto9 descriptiva que puede ser pu&licada> locali4ada e invocada a travs de InternetE= Los servicios 7e& 2acen posi&le la comunicacin entre aplicaciones en Internet> donde conviven m@ltiples plata/ormas y aplicaciones construidas en diversos lengua$es= )n los @ltimos a*os se 2an venido utili4ando otras tecnolog%as como %MI> (%:- o + (M> pero ninguna de ellas asegura una compati&ilidad total= Los servicios 7e& 2acen posi&le esta compati&ilidad al estar &asados en tecnologas est'ndar e independientes de plata/ormas y lengua$es> como HTTP> Q!+L> #++I> !(-P o XML9%P =

Terminolog%a
Tecnolog%as est1ndar

A)'L& Lengua$e para descri&ir servicios 7e&= 3''I& )speci/icacin para registros de servicios 7e&= )*AP& Lengua$e que especi/ica la /orma de enviar mensa$es XML a travs de Internet= XML+,P-& Mecanismo para invocacin remota de procedimientos ;mtodos< utili4ando XML como /orma de comunicacin=

APIs <ava

<AX,& -cceso a directorios de servicios= <AXM& )nvo de mensa$es XML= <AX+,P-& #so de XML9%P desde 3ava=

<AX,
,egistros

#n registro es una in/raestructura que /acilita el descu#rimiento de servicios "e#= )ste tipo de registros se encuentran disponi&les para cualquier organi4acin> normalmente como un servicio "e# m1s= )"isten varias especi$icaciones para estos registros> las m's importantes8 o 3''I> desarrollada por una serie de empresas= o e#XML> desarrollada por las organi4aciones (-!I! y #=?=O )1- T

Introduccin a <AX,

)s una API para <ava que permite tra#ajar con los registros de servicios 7e& sin preocuparnos de los detalles de los documentos XML que intervienen en las operaciones= )s independiente del tipo de registro concreto al que accedemos> pues se utili4a un modelo de contenido uni/icado= Permite reali4ar las siguientes operaciones &'sicas8 &uscar servicios 7e& disponi&les> pu&licar servicios 7e&> modi/icar los datos de un servicio> eliminar un servicio=

3n cliente <AX,

- continuacin mostramos el cdigo de un programa que #usca servicios "e# en un registro a partir de una cadena de caracteres de entrada=
"a,a!.!ml.re-istry.`$ "a,a!.!ml.re-istry.infomodel.`$ "a,a.net.`$ "a,a.util.`$

import import import import

public class =A>7Auery V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Csa-e< "a,a ( N (=A>7Auery <Guery1strin->(M$ /ystem.e!itL1M$ W /trin- Guery/trin- ' ne5 /trin-Lar-sE0FM$ /ystem.out.printlnL(Auery strin- is ( N Guery/trin-M$ =A>7Auery "G ' ne5 =A>7AueryLM$ "G.e!ecuteAueryLGuery/trin-M$ W public ,oid e!ecuteAueryL/trin- G/trin-M V Connection connection ' null$ // Definir propiedades de confi-uraci?n :roperties props ' ne5 :ropertiesLM$ props.set:ropertyL("a,a!.!ml.re-istry.GueryMana-erC7;( (http<//uddi.microsoft.com<20/inGuire(M$ props.set:ropertyL("a,a!.!ml.re-istry.factoryClass( (com.sun.!ml.re-istry.uddi.ConnectionIactory.mpl(M$ try V // Crear la cone!i?n con las propiedades definidas ConnectionIactory factory ' ConnectionIactory.ne5.nstanceLM$ factory.set:ropertiesLpropsM$ connection ' factory.createConnectionLM$ // 0btener -estor de consultas 7e-istry/er,ice rs ' connection.-et7e-istry/er,iceLM$ RusinessAueryMana-er bGm ' rs.-etRusinessAueryMana-erLM$ /ystem.out.printlnL(Yot re-istry ser,ice and ( N (Guery mana-er(M$ // Definir opciones y patr?n de b_sGueda

Collection findAualifiers ' ne5 Array;istLM$ findAualifiers.addLIindAualifier./078QR9QJAMEQDE/CM$ Collection name:atterns ' ne5 Array;istLM$ name:atterns.addL(T( N G/trin- N (T(M$ // Ruscar or-ani%aciones Rul[7esponse response ' bGm.find0r-ani%ationsLfindAualifiers name:atterns null null null nullM$ Collection or-s ' response.-etCollectionLM$ // Mostrar informaci?n de las or-ani%aciones obtenidas .terator or-.ter ' or-s.iteratorLM$ 5hile Lor-.ter.hasJe!tLMM V 0r-ani%ation or- ' L0r-ani%ationM or-.ter.ne!tLM$ /ystem.out.printlnL(0r- name< ( N -etJameLor-MM$ /ystem.out.printlnL(0r- description< ( N -etDescriptionLor-MM$ /ystem.out.printlnL(0r- [ey id< ( N -etPeyLor-MM$ // .nformaci?n de contacto Cser pc ' or-.-et:rimaryContactLM$ if Lpc 6' nullM V :ersonJame pcJame ' pc.-et:ersonJameLM$ /ystem.out.printlnL( Contact name< ( N pcJame.-etIullJameLMM$ Collection phJums ' pc.-et8elephoneJumbersLpc.-et8ypeLMM$ .terator ph.ter ' phJums.iteratorLM$ 5hile Lph.ter.hasJe!tLMM V 8elephoneJumber num ' L8elephoneJumberM ph.ter.ne!tLM$ /ystem.out.printlnL( :hone number< ( N num.-etJumberLMM$ W Collection eAddrs ' pc.-etEmailAddressesLM$ .terator ea.ter ' eAddrs.iteratorLM$ 5hile Lph.ter.hasJe!tLMM V /ystem.out.printlnL( Email Address< ( N LEmailAddressM ea.ter.ne!tLMM$ W W // .nformaci?n de los ser,icios Collection ser,ices ' or-.-et/er,icesLM$ .terator s,c.ter ' ser,ices.iteratorLM$ 5hile Ls,c.ter.hasJe!tLMM V /er,ice s,c ' L/er,iceM s,c.ter.ne!tLM$ /ystem.out.printlnL( /er,ice name< ( N -etJameLs,cMM$ /ystem.out.printlnL( /er,ice description< ( N -etDescriptionLs,cMM$ Collection ser,iceRindin-s ' s,c.-et/er,iceRindin-sLM$ .terator sb.ter ' ser,iceRindin-s.iteratorLM$ 5hile Lsb.ter.hasJe!tLMM V /er,iceRindin- sb ' L/er,iceRindin-M sb.ter.ne!tLM$ /ystem.out.printlnL( Rindin- ( N (Description< ( N -etDescriptionLsbMM$ /ystem.out.printlnL( Access C7.< ( N sb.-etAccessC7.LMM$ W W /ystem.out.printlnL( 111 (M$ W W catch LE!ception eM V e.print/tac[8raceLM$ W finally V

// Cerrar cone!i?n if Lconnection 6' nullM V try V connection.closeLM$ W catch L=A>7E!ception "eM VW W W W

pri,ate /trin- -etJameL7e-istry0b"ect roM thro5s =A>7E!ception V try V return ro.-etJameLM.-et]alueLM$ W catch LJull:ointerE!ception npeM V return (($ W W pri,ate /trin- -etDescriptionL7e-istry0b"ect roM thro5s =A>7E!ception V try V return ro.-etDescriptionLM.-et]alueLM$ W catch LJull:ointerE!ception npeM V return (($ W W pri,ate /trin- -etPeyL7e-istry0b"ect roM thro5s =A>7E!ception V try V return ro.-etPeyLM.-et.dLM$ W catch LJull:ointerE!ception npeM V return (($ W W W

<AXM
Mensajes )*AP

#n mensa$e !(-P tiene la siguiente estructura8 o Parte !(-P a&ecera ;opcional< uerpo o Parte ad$unta K ;opcional> p= e$= te"to plano< o Parte ad$unta T ;opcional> p= e$= una imagen<

Introduccin a <AXM

)s una API para <ava que permite tra#ajar con mensajes )*AP sin preocuparnos de los detalles de los documentos XML que intervienen en las operaciones= Permite enviar mensa$es de dos $ormas8 o Mediante una cone"in punto a punto8 el programa enva el mensa$e directamente al destinatario> quedando &loqueado a la espera de una respuesta= o Mediante un proveedor de mensajes8 se enva el mensa$e a un proveedor que ser' el encargado de 2acerlo llegar al destinatario> sin producirse ning@n &loqueo en espera de una respuesta=

(jemplos

)l siguiente programa construye un mensa$e !(-P> en el que se pregunta por el precio de cotizacin de una compa5%a> lo enva a un servicio de in/ormacin de coti4aciones> y muestra el resultado o&tenido8

import "a,a!.!ml.soap.`$ import "a,a!.!ml.messa-in-.`$ import "a,a.io.`$

import "a,a.util.`$ public class 7eGuest V public static ,oid mainL/trin-EF ar-sM try V V

// Crear la cone!i?n /0A:ConnectionIactory scIactory ' /0A:ConnectionIactory.ne5.nstanceLM$ /0A:Connection con ' scIactory.createConnectionLM$ // Crear el mensa"e Messa-eIactory factory ' Messa-eIactory.ne5.nstanceLM$ /0A:Messa-e messa-e ' factory.createMessa-eLM$ // 0btener componentes del mensa"e /0A::art soap:art ' messa-e.-et/0A::artLM$ /0A:En,elope en,elope ' soap:art.-etEn,elopeLM$ /0A:Keader header ' en,elope.-etKeaderLM$ /0A:Rody body ' en,elope.-etRodyLM$ // Auitar cabecera header.detachJodeLM$ // Aaadir elemento para llamada Jame bodyJame ' en,elope.createJameL(Yet;ast8rade:rice( (m( (http<//5ombat.%trade.com(M$ /0A:RodyElement -ltp ' body.addRodyElementLbodyJameM$ // Aaadir elemento para dato de entrada Jame name ' en,elope.createJameL(symbol(M$ /0A:Element symbol ' -ltp.addChildElementLnameM$ symbol.add8e!tJodeL(/CJS(M$ // C7; Destino C7;Endpoint endpoint ' ne5 C7;EndpointL (http<//5ombat.%trade.com/Guotes(M$ // En,*ar mensa"e 1 bloGueo 1 obtener respuesta /0A:Messa-e response ' con.callLmessa-e endpointM$ /` Mensa"e /0A: </0A:1EJ]<En,elope !mlns</0A:1EJ]'(http<//schemas.!mlsoap.or-/soap/en,elope/( </0A:1EJ]<Rody> <m<Yet;ast8rade:rice !mlns<m' (http<//5ombat.%trade.com(> <symbol>/CJS</symbol> </m<Yet;ast8rade:rice> <//0A:1EJ]<Rody> <//0A:1EJ]<En,elope> `/ // Cerrar la cone!i?n con.closeLM$ // 0btener cuerpo del mensa"e /0A::art sp ' response.-et/0A::artLM$ /0A:En,elope se ' sp.-etEn,elopeLM$ /0A:Rody sb ' se.-etRodyLM$ // 0btener respuesta .terator it ' sb.-etChildElementsLbodyJameM$ /0A:RodyElement bodyElement ' L/0A:RodyElementMit.ne!tLM$ /trin- last:rice ' bodyElement.-et]alueLM$ // .mprimir respuesta /ystem.out.printL(8he last price for /CJS is (M$ /ystem.out.printlnLlast:riceM$

W W

W catch LE!ception e!M V e!.print/tac[8raceLM$ W

)l siguiente programa enva un mensa$e !(-P con un nom#re de compa5%a a un registro 3''I> y muestra los datos o&tenidos del registro8
import import import import "a,a!.!ml.soap.`$ "a,a!.!ml.messa-in-.`$ "a,a.util.`$ "a,a.io.`$

public class MyCddi:in- V public static ,oid mainL/trin-EF ar-sM V try V // Comprobar el ar-umento de entrada if Lar-s.len-th 6' 1M V /ystem.err.printlnL(Csa-e< Cddi:in- business1name(M$ /ystem.e!itL1M$ W // Crear la cone!i?n y el mensa"e /0A:ConnectionIactory scf ' /0A:ConnectionIactory.ne5.nstanceLM$ /0A:Connection connection ' scf.createConnectionLM$ Messa-eIactory ms-Iactory ' Messa-eIactory.ne5.nstanceLM$ /0A:Messa-e ms- ' ms-Iactory.createMessa-eLM$ // 0btener el cuerpo del mensa"e /0A:En,elope en,elope ' ms-.-et/0A::artLM.-etEn,elopeLM$ /0A:Rody body ' en,elope.-etRodyLM$ // Aaadir informaci?n de consulta /0A:RodyElement findRusiness ' body.addRodyElementLen,elope. createJameL(findQbusiness( (( (urn<uddi1or-<api(MM$ findRusiness.addAttributeLen,elope.createJameL(-eneric(M (1.0(M$ findRusiness.addAttributeLen,elope.createJameL(ma!7o5s(M (100(M$ /0A:Element businessJame ' findRusiness.addChildElementL en,elope.createJameL(name(MM$ businessJame.add8e!tJodeLar-sE0FM$ // C7; destino C7;Endpoint endpoint ' ne5 C7;Endpoint L(http<//5551&.ibm.com/ser,ices/uddi/testre-istry/inGuiryapi(M$ // En,*ar mensa"e 1 bloGueo 1 obtener respuesta /0A:Messa-e reply ' connection.callLms- endpointM$ // Escribir mensa"e de respuesta en un fichero /ystem.out.printlnL(7ecei,ed reply from< ( N endpointM$ reply.5rite8oLne5 Iile0utput/treamL(res.!ml(MM$ // E!traer el cuerpo /0A:Rody replyRody ' reply.-et/0A::artLM.-etEn,elopeLM.-etRodyLM$ /ystem.out.printlnL((M$ /ystem.out.printlnL((M$ /ystem.out.printL (Content e!tracted from the reply messa-e< (M$ // Mostrar informaci?n .terator iter1 ' replyRody.-etChildElementsLM$ 5hile Liter1.hasJe!tLMM V /0A:RodyElement bodyElement ' L/0A:RodyElementMiter1.ne!tLM$ .terator iter) ' bodyElement.-etChildElementsLM$

5hile Liter).hasJe!tLMM V /0A:Element child) ' L/0A:ElementMiter).ne!tLM$ .terator iter& ' child).-etChildElementsLM$ /trin- content ' child).-et]alueLM$ /ystem.out.printlnLcontentM$ 5hile Liter&.hasJe!tLMM V /0A:Element child& ' L/0A:ElementMiter&.ne!tLM$ .terator iter4 ' child&.-etChildElementsLM$ content ' child&.-et]alueLM$ /ystem.out.printlnLcontentM$ 5hile Liter4.hasJe!tLMM V /0A:Element child4 ' L/0A:ElementMiter4.ne!tLM$ content ' child4.-et]alueLM$ /ystem.out.printlnLcontentM$ W W W W // Cerrar la cone!i?n connection.closeLM$ W catch LE!ception e!M V e!.print/tac[8raceLM$ W

W W

<AX+,PIntroduccin

)s una API para <ava que permite construir servicios "e# y clientes para los servicios sin preocuparnos de los detalles de los documentos XML que intervienen en las operaciones= Las llamadas a los mtodos y las respuestas se implementan mediante mensajes )*AP= )n un servicio "e#> los mtodos que lo constituyen se de/inen en un inter/a4 y se implementan en una clase aparte= )n un cliente> las llamadas a los mtodos se reali4an mediante o&$etos locales que representan el mtodo remoto ;stu&s<= #n cliente escrito con 3-X9%P puede interactuar con un servicio escrito en otro lenguaje> y viceversa> pues esta tecnologa se &asa en una serie de est'ndares como HTTP> !(-P y Q!+L=

3n ejemplo

- continuacin se muestra un sencillo ejemplo de servicio con un cliente que lo utili4a8

pac[a-e /7$ import "a,a.rmi.7emote$ import "a,a.rmi.7emoteE!ception$ public interface /7.nt e!tends 7emote V public int sumaLint a int bM thro5s 7emoteE!ception$ public int restaLint a int bM thro5s 7emoteE!ception$ W pac[a-e /7$ public class /7.mpl implements /7.nt V public int sumaLint a int bM V

return a N b$ int bM V

public int restaLint a return a 1 b$ W W pac[a-e /7$

public class /7Client V public static ,oid mainL/trin-EF ar-sM V try V /7.ntQ/tub stub ' L/7.ntQ/tubMLne5 /er,icio/7.mplLM.-et/7.ntLMM$ stub.Qset8ar-etEndpointLar-sE0FM$ /ystem.out.printlnLstub.sumaL& 2MM$ /ystem.out.printlnLstub.restaL)& 2MM$ W catch LE!ception e!M V e!.print/tac[8raceLM$ W W W

Apuntes de XML
Autor: Diego Arranz Hernando

:i&liogra/a recomendada o )n ingls o )n castellano

0i#liogra$%a recomendada
(n ingl s
<ava B XML6 Cnd (dition& )olutions to ,eal+Aorld Pro#lems (%eilly :rett McLaug2lin !eptiem&re TMMK Modeling XML Applications "it7 3ML -ddison Qesley +avid arlson -&ril TMMK

(n castellano
<ava y XML -naya (%eilly :rett McLaug2lin TMMK >u%a de aprendizaje XML Prentice Hall )li4a&et2 astro TMMK

Apuntes de XML
Autor: Diego Arranz Hernando

)nlaces recomendados o 5enerales o Introduccin o reacin de documentos XML o %estriccin de documentos XML o Presentacin y trans/ormacin de documentos XML o Manipulacin de XML desde programas 3ava o XML y las &ases de datos o (tros temas de inters o !ervicios 7e&

(nlaces recomendados
>enerales

Ultimas noticias so&re XML ;ingls< )nlaces a so/t7are XML ;ingls< 3ava y XML ;ingls< Proyecto cola&orativo -pac2e XML ;ingls< XML en Microso/t ;ingls< +ise*o de aplicaciones XML con #ML ;ingls<

Introduccin

XML en KM puntos :reve tutorial de Vngel :ar&ero 1-S so&re XML ;ingls< Motivacin del XML ;ingls<

-reacin de documentos XML



)speci/icacin XML en castellano )speci/icacin XML comentada ;ingls< !encillo editor XML ;ingls< ompleto editor XML con innumera&les opciones ;ingls<

,estriccin de documentos XML



Tutorial so&re +T+ (tro tutorial so&re +T+ ;ingls< Tutorial so&re esquemas XML ;ingls< ompletsimo curso so&re esquemas XML en transparencias ;ingls<

Presentacin y trans$ormacin de documentos XML



#so de !! con XML M's so&re uso de !! con XML +ocumentacin de Microso/t> so&re X!LT> Xpat2> etc= Tutorial so&re X!LT con numerosos e$emplos ;ingls<

Tutorial so&re X!LT y Xpat2 ;ingls< )speci/icacin XPat2 en castellano

Manipulacin de XML desde programas <ava



Tutorial traducido del sitio o/icial de !un> so&re !-X> +(M> XML> +T+> etc= P'gina de !-X ;ingls< P'gina de +(M en el QR ;ingls< P'gina del anali4ador Xerces ;ingls< P'gina del procesador ;X!LT< Xalan ;ingls<

XML y las #ases de datos



-PIs y 2erramientas de conversin ;ingls< :ases de datos nativas XML ;ingls<

*tros temas de inter s



XLin6 ;ingls< 3+(M ;ingls< Tutorial so&re ocoon P'gina de ocoon ;ingls<

)ervicios "e#

?oticias y artculos 3ava y servicios 7e&

Apuntes de XML
Autor: Diego Arranz Hernando

Material utili4ado o :i&liogra/a o )nlaces o Herramientas

Material utilizado
0i#liogra$%a
<ava y XML -naya (%eilly :rett McLaug2lin TMMK >u%a de aprendizaje XML Prentice Hall )li4a&et2 astro TMMK

(nlaces

Tutorial traducido del sitio o/icial de !un> so&re !-X> +(M> XML> +T+> etc= urso so&re esquemas XML de %oger L= ostello XML en Microso/t Tutorial so&re XLin6 P'gina de 3+(M Tutorial so&re ocoon Tutorial de !un so&re servicios 7e&

Herramientas

XML!py W=R ;versin de evaluacin< 3+P K=W Xerces ;-pac2e< 3Q!+P )-K

Apuntes de XML
Autor: Diego Arranz Hernando

)$ercicios

o o o o o o o

reacin de documentos XML )nunciado !olucin +T+s )nunciado !olucin )squemas XML )nunciado !olucin X!LT )nunciado !olucin !-X )nunciado !olucin +(M )nunciado !olucin +(M ;otro< )nunciado !olucin

(jercicios
-reacin de documentos XML
(nunciado
onstruir un documento XML para el siguiente pedido que 2a reci&ido por correo electrnico una empresa que se dedica a la venta de 2erramientas para $ardinera8 EHola> necesito una cortadora de cesped para mi $ardn de esas que anuncian en o/erta> me gustara que /uera uno de esos modelos elctricos> pues las de gasolina contaminan muc2o= Me llamo %o&erto Movilla> la cortadora la tendr'n que enviar a -l&acete> la direccin es Pla4a de la +uquesa KT> la recoger' mi esposa que se llama -licia -&ad= -2ora que lo pienso tam&in necesitar R podadoras para los setos= Les paso mi direccin de aqu para lo re/erente al pago> es 5eneral %icardos XY> aqu en Madrid= )s urgente> por /avor> el csped est' muy alto=E La /ec2a del pedido es el TM de octu&re del ZZ= )l empleado que se encarga del pedido 2a compro&ado algunos datos necesarios8 el cdigo postal de la direccin de -l&acete es MXMTM y el de la de Madrid TNMXXB tam&in 2a consultado el cat'logo de productos y 2a averiguado que la cortadora vale KWN=ZX euros y su cdigo de producto es NLT9--> aunque no sa&e si es o no elctricaB una podadora vale L=ZN y su cdigo es ZTY91H=

)olucin
<+!ml ,ersion'(1.0( encodin-'(./01223411(+> <:edido !mlns'(http<//555.miempresa.or-/pedidos( fecha'(14441101)0(> <Destino> <Jombre>Alicia Abad</Jombre> <Direccion>:la%a de la DuGuesa 1)</Direccion>

<Ciudad>Albacete</Ciudad> <Cod:ostal>030)0</Cod:ostal> </Destino> <0rdenante> <Jombre>7oberto Mo,illa</Jombre> <Direccion>Yeneral 7icardos 3D</Direccion> <Ciudad>Madrid</Ciudad> <Cod:ostal>)2033</Cod:ostal> </0rdenante> <0bser,aciones>Es ur-ente el cBsped estZ muy alto</0bser,aciones> <Contenido> <:roducto codi-o'(2@)1AA(> <Jombre>Cortadora de cesped</Jombre> <Cantidad>1</Cantidad> <:recio>142.43</:recio> <0bser,aciones>Confirmar Gue es elBctrica</0bser,aciones> </:roducto> <:roducto codi-o'(4)D1IK(> <Jombre>:odadora</Jombre> <Cantidad>&</Cantidad> <:recio>@.42</:recio> </:roducto> </Contenido> </:edido>

'T's
(nunciado
onstruir un documento +T+ para el documento XML del e$ercicio anterior=

)olucin
<6D0C89:E :edido /9/8EM (:edido.dtd(> ... <6E;EMEJ8 :edido LDestino 0rdenante 0bser,aciones ContenidoM> <6A88;./8 :edido !mlns CDA8A H7EAC.7ED fecha CDA8A H7EAC.7ED > <6E;EMEJ8 Destino LJombre Direccion Ciudad Cod:ostalM> <6E;EMEJ8 0rdenante LJombre Direccion Ciudad Cod:ostalM> <6E;EMEJ8 Jombre LH:CDA8AM> <6E;EMEJ8 Direccion LH:CDA8AM> <6E;EMEJ8 Ciudad LH:CDA8AM> <6E;EMEJ8 Cod:ostal LH:CDA8AM> <6E;EMEJ8 0bser,aciones LH:CDA8AM> <6E;EMEJ8 Contenido L:roductoNM> <6E;EMEJ8 :roducto LJombre Cantidad :recio 0bser,aciones+M> <6A88;./8 :roducto codi-o CDA8A H7EAC.7ED > <6E;EMEJ8 Cantidad LH:CDA8AM> <6E;EMEJ8 :recio LH:CDA8AM>

(squemas XML
(nunciado
onstruir un esquema XML para la siguiente +T+8
<6E;EMEJ8 ;ibro L8itulo <6A88;./8 ;ibro !mlns CDA8A H7EAC.7ED > Contenido Copyri-htM>

<6E;EMEJ8 8itulo LH:CDA8AM> <6E;EMEJ8 Contenido LLCapituloN /eparacion+MNM> <6E;EMEJ8 Capitulo L8ema /eccionNM> <6A88;./8 Capitulo materia L>M;O=a,aM (=a,a( > <6E;EMEJ8 8ema LH:CDA8AM> <6E;EMEJ8 /eccion LH:CDA8AM> <6A88;./8 /eccion apartados CDA8A H7EAC.7ED dificil LsiOnoM (no( > <6E;EMEJ8 /eparacion EM:89> <6E;EMEJ8 Copyri-ht LH:CDA8AM>

y pro&arlo con este documento8


<+!ml ,ersion'(1.0( encodin-'(./01223411( standalone'(no(+> <6D0C89:E ;ibro E <6EJ8.89 07eillyCopyri-ht /9/8EM (copyri-ht.t!t(> F> <;ibro !mlns'(http<//555.mislibros.com/libros/"a,a!ml( !mlns<Catalo-o'(http<//555.mislibros.com/catalo-o( !mlns<!si'(http<//555.5&.or-/)001/>M;/chema1instance( !si<schema;ocation'(http<//555.mislibros.com/libros/"a,a!ml libro.!sd(> <8itulo>=a,a y >M;</8itulo> <Contenido> <Capitulo materia'(>M;(> <8ema>.ntroducci?n</8ema> </eccion apartados'(@(>AuB es<//eccion> </eccion apartados'(&(>C?mo se usa<//eccion> </Capitulo> <Capitulo materia'(>M;(> <8ema>Creando >M;</8ema> </eccion apartados'(0(>Cn documento >M;<//eccion> </eccion apartados'()(>;a cabecera<//eccion> </eccion apartados'(D(>El contenido<//eccion> </Capitulo> <Capitulo> <8ema>Anali%ando >M;</8ema> </eccion apartados'(&(>:reparaci?n<//eccion> </eccion apartados'(&( dificil'(true(>/A><//eccion> </eccion apartados'(4( dificil'(true(>Mane"adores<//eccion> </eccion apartados'(0(>Cna forma me"or de car-ar el anali%ador<//eccion> </Capitulo> </eparacion/> <Capitulo materia'(=a,a(> <8ema>=D0M</8ema> </eccion apartados'()(>.ntroducci?n<//eccion> </eccion apartados'(4( dificil'(true(>D0M#amp$=D0M<//eccion> </Capitulo> </Contenido> <Copyri-ht>#07eillyCopyri-ht$</Copyri-ht> </;ibro>

)olucin
<+!ml ,ersion'(1.0(+> <!s<schema !mlns<!s'(http<//555.5&.or-/)001/>M;/chema(

tar-etJamespace'(http<//555.mislibros.com/libros/"a,a!ml( !mlns'(http<//555.mislibros.com/libros/"a,a!ml( elementIormDefault'(Gualified(> <!s<element name'(;ibro( type'(8ipo;ibro(/> <!s<comple!8ype name'(8ipo;ibro(> <!s<seGuence> <!s<element name'(8itulo( type'(!s<strin-(/> <!s<element name'(Contenido( type'(8ipoContenido(/> <!s<element name'(Copyri-ht( type'(!s<strin-(/> </!s<seGuence> </!s<comple!8ype> <!s<comple!8ype name'(8ipoContenido(> <!s<seGuence ma!0ccurs'(unbounded(> <!s<element name'(Capitulo( type'(8ipoCapitulo( ma!0ccurs'(unbounded(/> <!s<element name'(/eparacion( type'(8ipo]acio( min0ccurs'(0(/> </!s<seGuence> </!s<comple!8ype> <!s<comple!8ype name'(8ipoCapitulo(> <!s<seGuence> <!s<element name'(8ema( type'(!s<strin-(/> <!s<element name'(/eccion( type'(8ipo/eccion( ma!0ccurs'(unbounded(/> </!s<seGuence> <!s<attribute name'(materia( type'(8ipoMateria( default'(=a,a(/> </!s<comple!8ype> <!s<comple!8ype name'(8ipo/eccion(> <!s<simpleContent> <!s<e!tension base'(!s<strin-(> <!s<attribute name'(apartados( type'(!s<nonJe-ati,e.nte-er( use'(reGuired(/> <!s<attribute name'(dificil( type'(!s<boolean( default'(false(/> </!s<e!tension> </!s<simpleContent> </!s<comple!8ype> <!s<simple8ype name'(8ipoMateria(> <!s<restriction base'(!s<strin-(> <!s<enumeration ,alue'(=a,a(/> <!s<enumeration ,alue'(>M;(/> </!s<restriction> </!s<simple8ype> <!s<comple!8ype name'(8ipo]acio(/> </!s<schema>

X)LT
(nunciado
- partir del siguiente documento XML> reali4ar una 2o$a de estilo X!LT que muestre los datos en una ta&la> con las siguientes caractersticas8 las empresas aparecen ordenadas por el precio de coti4acin> los precios supreriores a LX aparecen en a4ul y los in/eriores a TX en ro$o> las empresas del ndice general aparecen marcadas con un ;H<> con una e"plicacin de&a$o de la ta&la= )l ttulo del documento re/le$a el da y 2ora de la in/ormacin=
<+!ml ,ersion'(1.0( +> <Rolsa !mlns'(http<//555.labolsa.com( dia'(31@1)001( hora'(11<&4(> <Empresa indice'(-eneral(> <Jombre>Yeneral Motors</Jombre> </imbolo>YM0<//imbolo> <:recio>)2.2@3</:recio> </Empresa> <Empresa indice'(tecno(> <Jombre>Adobe</Jombre>

</imbolo>ADR<//imbolo> <:recio>4).)30</:recio> </Empresa> <Empresa indice'(tecno(> <Jombre>Microsoft</Jombre> </imbolo>M/I<//imbolo> <:recio>)0.&1&</:recio> </Empresa> <Empresa indice'(-eneral(> <Jombre>Coca1Cola</Jombre> </imbolo>C0C<//imbolo> <:recio>&2.243</:recio> </Empresa> <Empresa indice'(tecno(> <Jombre>/un Microsystems</Jombre> </imbolo>/CJ<//imbolo> <:recio>43.114</:recio> </Empresa> </Rolsa>

)olucin
<+!ml ,ersion'(1.0( encodin-'(./01223411( +> <!sl<stylesheet !mlns<!sl'(http<//555.5&.or-/1444/>/;/8ransform( !mlns<Rolsa'(http<//555.labolsa.com( ,ersion'(1.0(> <!sl<template match'(Rolsa<Rolsa(> <html> <head> <title>;a bolsa el <!sl<,alue1of select'(\dia( /> a las <!sl<,alue1of select'(\hora( /></title> </head> <body> <table border'()( ali-n'(center(> <tr> <th>/*mbolo</th> <th>Jombre</th> <th>:recio</th> </tr> <!sl<for1each select'(Rolsa<Empresa(> <!sl<sort select'(Rolsa<:recio( order'(descendin-(/> <tr> <td> <!sl<,alue1of select'(Rolsa</imbolo(/> </td> <td> <!sl<,alue1of select'(Rolsa<Jombre(/> <!sl<if test'(\indice'^-eneral^(> L`M</!sl<if> </td> <td> <!sl<choose> <!sl<5hen test'(Rolsa<:recio #-t$ @3(> <font color'(blue(><!sl<,alue1of select'(Rolsa<:recio(/></font> </!sl<5hen> <!sl<5hen test'(Rolsa<:recio #lt$ )3(> <font color'(red(><!sl<,alue1of select'(Rolsa<:recio(/></font> </!sl<5hen> <!sl<other5ise> <!sl<,alue1of select'(Rolsa<:recio(/> </!sl<other5ise> </!sl<choose> </td> </tr> </!sl<for1each> </table> <p ali-n'(center(>L`M Estas empresas son del *ndice -eneral</p> </body> </html> </!sl<template>

</!sl<stylesheet>

)AX
(nunciado
%eali4ar mediante !-X un programa para el documento del li&ro= )l programa de&e escri&ir en un /ic2ero los ttulos de los captulos y un peque*o resumen para cada uno de ellos con el n@mero de secciones> de apartados totales y de apartados di/ciles=

)olucin
import import import import import import import import "a,a.io..0E!ception$ "a,a.io.IileSriter$ or-.!ml.sa!./A>E!ception$ or-.!ml.sa!.>M;7eader$ or-.!ml.sa!.Attributes$ or-.!ml.sa!.ContentKandler$ or-.!ml.sa!.;ocator$ or-.!ml.sa!.helpers.>M;7eaderIactory$

public class E"ercicio/A> V public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V /ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Anali%ando< ( N fich N (Un(M$ try V >M;7eader parser ' >M;7eaderIactory.create>M;7eaderL (or-.apache.!erces.parsers./A>:arser(M$ Mane"adorCaps man ' ne5 Mane"adorCapsLM$ parser.setContentKandlerLmanM$ parser.parseLfichM$ /ystem.out.printlnL(Iin del anZlisis. 8odo bienUn(M$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W W W W class Mane"adorCaps implements ContentKandler V pri,ate pri,ate pri,ate pri,ate pri,ate pri,ate ;ocator loc$ IileSriter f$ boolean e!traer$ int num/ecciones$ int numApartados$ int numDificiles$

public ,oid setDocument;ocatorL;ocator lM V loc ' l$ W public ,oid startDocumentLM thro5s /A>E!ception V try V num/ecciones ' 0$ numApartados ' 0$ numDificiles ' 0$ f ' ne5 IileSriterL(capitulos.t!t(M$ W catch L.0E!ception eM V

W W

thro5 ne5 /A>E!ception L(:roblemas al abrir fichero(M$

public ,oid endDocumentLM thro5s /A>E!ception V try V f.closeLM$ W catch L.0E!ception eM V thro5 ne5 /A>E!ception L(:roblemas al cerrar fichero(M$ W W public ,oid startElementL/trin- espacio /trin- nom;ocal /trin- nomCompleto Attributes atrsM V if Lnom;ocal.eGualsL(8ema(MM V e!traer ' true$ W else if LnomCompleto.eGualsL(/eccion(MM V num/eccionesNN$ numApartados N' .nte-er.parse.ntLatrs.-et]alueL0MM$ if Latrs.-et]alueL1M.eGualsL(si(MM V numDificilesNN$ W W W public ,oid endElementL/trin- espacio /trin- nom;ocal /trin- nomCompletoM thro5s /A>E!ception V if Lnom;ocal.eGualsL(8ema(MM V e!traer ' false$ W else if Lnom;ocal.eGualsL(Capitulo(MM V try V f.5riteL(Ut( N num/ecciones N ( seccionesUrUn( N (Ut( N numApartados N ( apartadosUrUn( N (UtL( N numDificiles N ( dif*cilesMUrUn(M$ num/ecciones ' 0$ numApartados ' 0$ numDificiles ' 0$ W catch L.0E!ception eM V thro5 ne5 /A>E!ception L(:roblemas al escribir en fichero(M$ W W W public ,oid charactersLcharEF ch int comien%o int finM thro5s /A>E!ception V try V if Le!traerM V /trin- tema ' ne5 /trin-Lch comien%o finM$ f.5riteLtema N (UrUn(M$ W W catch L.0E!ception eM V thro5 ne5 /A>E!ception L(:roblemas al escribir en fichero(M$ W W public ,oid processin-.nstructionL/trin- destino W public ,oid start:refi!Mappin-L/trin- prefi"o W public ,oid end:refi!Mappin-L/trin- prefi"oM V W public ,oid i-norableShitespaceLcharEF ch W int comien%o int finM V /trin- datosM V

/trin- uriM V

public ,oid s[ippedEntityL/trin- nombreM V W W

'*M
(nunciado
%eali4ar mediante +(M un programa para el documento del li&ro= )l programa de&e escri&ir en un /ic2ero los ttulos de los captulos y un peque*o resumen para cada uno de ellos con el n@mero de secciones> de apartados totales y de apartados di/ciles=

)olucin
import import import import import import import import import or-.5&c.dom.Document$ or-.5&c.dom.Jode$ or-.5&c.dom.Element$ or-.5&c.dom.Jode;ist$ or-.5&c.dom.JamedJodeMap$ "a,a.io..0E!ception$ or-.!ml.sa!./A>E!ception$ or-.apache.!erces.parsers.D0M:arser$ "a,a.io.IileSriter$

public class E"ercicioD0M V static static static static IileSriter f$ int num/ecciones$ int numApartados$ int numDificiles$

public static ,oid procesarLJode nodoM thro5s .0E!ception V Element e ' LElementMnodo$ /trin- nombre ' e.-etJodeJameLM$ if Lnombre.eGualsL(;ibro(MM V f ' ne5 IileSriterL(capitulosD0M.t!t(M$ Jode;ist hi"os ' e.-etElementsRy8a-JameL(Capitulo(M$ for Lint i'0$ i<hi"os.-et;en-thLM$ iNNM V procesarLhi"os.itemLiMM$ W f.closeLM$ W else if Lnombre.eGualsL(Capitulo(MM V procesarLe.-etElementsRy8a-JameL(8ema(M.itemL0MM$ Jode;ist hi"os ' e.-etElementsRy8a-JameL(/eccion(M$ num/ecciones ' hi"os.-et;en-thLM$ numApartados ' 0$ numDificiles ' 0$ for Lint i'0$ i<hi"os.-et;en-thLM$ iNNM V procesarLhi"os.itemLiMM$ W f.5riteL(Ut/ecciones< ( N num/ecciones N (UrUn(M$ f.5riteL(UtApartados< ( N numApartados N (UrUn(M$ f.5riteL(UtLDif*ciles< ( N numDificiles N (MUrUn(M$ W else if Lnombre.eGualsL(8ema(MM V f.5riteLe.-etIirstChildLM.-etJode]alueLM N (UrUn(M$ W else if Lnombre.eGualsL(/eccion(MM V numApartados N' .nte-er.parse.ntLe.-etAttributeL(apartados(MM$ if Le.-etAttributeL(dificil(M.eGualsL(si(MM V numDificilesNN$ W W

public static ,oid mainL/trin-EF ar-sM V if Lar-s.len-th 6' 1M V

/ystem.out.printlnL(Debe haber un parZmetro Lel ficheroM(M$ W else V /trin- fich ' ar-sE0F$ /ystem.out.printlnL(Yenerando Zrbol para< ( N fich N (Un(M$ try V D0M:arser parser ' ne5 D0M:arserLM$ parser.parseLfichM$ Document doc ' parser.-etDocumentLM$ procesarLdoc.-etDocumentElementLMM$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W catch L/A>E!ception eM V /ystem.out.printlnLeM$ W W W W

'*M DotroE
(nunciado
%eali4ar mediante +(M un programa a partir de un documento con las notas detalladas de una serie de alumnos de una clase= )l programa de&e imprimir por pantalla la media de cada alumno y la media total de la clase> as como generar un documento XML con esta in/ormacin= )ntrada
<+!ml ,ersion'(1.0(+> <course> <teacher id'("p(> <name>=ohn :unin</name> </teacher> <student id'("s(> <name>=ohn /mith</name> <h51>&0</h51> <h5)>@0</h5)> <pro"ect>20</pro"ect> <final>23</final> </student> <student id'(-l(> <name>Yeor-e ;ucas</name> <h51>20</h51> <h5)>40</h5)> <pro"ect>100</pro"ect> <final>40</final> </student> <student id'(lr(> <name>Eli%abeth 7oberts</name> <h51>D0</h51> <h5)>43</h5)> <pro"ect>30</pro"ect> <final>100</final> </student> </course>

!alida
Alumno =ohn /mith ' DD.)3 Alumno Yeor-e ;ucas ' @@.3 Alumno Eli%abeth 7oberts ' @D.)3 Media de la clase ' @&.&&&&&D <+!ml ,ersion'(1.0( encodin-'(C8I12(+> <Jotas Media'(@&.&&&&&D(> <Alumno> <Jombre>=ohn /mith</Jombre> <Jota>DD.)3</Jota> </Alumno> <Alumno>

<Jombre>Yeor-e ;ucas</Jombre> <Jota>@@.3</Jota> </Alumno> <Alumno> <Jombre>Eli%abeth 7oberts</Jombre> <Jota>@D.)3</Jota> </Alumno> </Jotas>

)olucin
import import import import import or-.5&c.dom.`$ "a,a!.!ml.parsers.`$ or-.apache.!erces.dom.Document.mpl$ or-.apache.!ml.seriali%e.`$ "a,a.io.`$

public class 0troE"D0M V static float notasEFEF ' ne5 floatE100FE3F$ static /trin- nombresEF ' ne5 /trin-E100F$ public static ,oid mainL/trin-EF ar-sM V try V DocumentRuilder parser$ DocumentRuilderIactory factoria ' DocumentRuilderIactory.ne5.nstanceLM$ parser ' factoria.ne5DocumentRuilderLM$ Document doc ' parser.parseLar-sE0FM$ Jode;ist studs ' doc.-etElementsRy8a-JameL(student(M$ for Lint i'0$ i<studs.-et;en-thLM$ iNNM V tratar/tudLLElementM studs.itemLiM iM$ W calcularJotasLstuds.-et;en-thLMM$ W catch LE!ception eM V e.print/tac[8raceL/ystem.errM$ W int num/tudM V (h51(MM$ (h5)(MM$ (pro"ect(MM$ (final(MM$

pri,ate static ,oid tratar/tudLElement elem/tud

nombresEnum/tudF ' e!traer]alorLelem/tud (name(M$ notasEnum/tudFE0F ' .nte-er.parse.ntLe!traer]alorLelem/tud notasEnum/tudFE1F ' .nte-er.parse.ntLe!traer]alorLelem/tud notasEnum/tudFE)F ' .nte-er.parse.ntLe!traer]alorLelem/tud notasEnum/tudFE&F ' .nte-er.parse.ntLe!traer]alorLelem/tud W

pri,ate static /trin- e!traer]alorLElement elem /trin- campoM V Element subElem ' LElementM elem.-etElementsRy8a-JameLcampoM.itemL0M$ return subElem.-etIirstChildLM.-etJode]alueLM$ W pri,ate static ,oid calcularJotasLint num/tudsM V float media ' 0$ int i ' 0 " ' 0$ /ystem.out.printlnLM$ forLi ' 0$ i < num/tuds $ iNNM V float total ' 0$ forL" ' 0$ " < 4$ "NNM V total N' notasEiFE"F$ W notasEiFE4F ' total/4$ media N' notasEiFE4F$ /ystem.out.printlnL(Alumno ( N nombresEiF N ( ' ( N notasEiFE4FM$ W media /' num/tuds$ /ystem.out.printlnL(Media de la clase ' ( N mediaM$

/ystem.out.printlnLM$ try V Document doc' ne5 Document.mplLM$ Element rai% ' doc.createElementL(Jotas(M$ rai%.setAttributeL(Media( /trin-.,alue0fLmediaMM$ forLi ' 0$ i < num/tuds $ iNNM V Element alumno ' doc.createElementL(Alumno(M$ Element nombre ' doc.createElementL(Jombre(M$ nombre.appendChildLdoc.create8e!tJodeLnombresEiFMM$ alumno.appendChildLnombreM$ Element nota ' doc.createElementL(Jota(M$ nota.appendChildLdoc.create8e!tJodeL/trin-.,alue0fLnotasEiFE4FMMM$ alumno.appendChildLnotaM$ rai%.appendChildLalumnoM$ W doc.appendChildLrai%M$ 0utputIormat formato ' ne5 0utputIormatLdoc (C8I12( /trin-Sriter s ' ne5 /trin-SriterLM$ >M;/eriali%er ser ' ne5 >M;/eriali%erLs formatoM$ ser.seriali%eLdocM$ /ystem.out.printlnLs.to/trin-LMM$ IileSriter f ' ne5 IileSriterL(notas.!ml(M$ ser ' ne5 >M;/eriali%erLf formatoM$ ser.seriali%eLdocM$ W catch L.0E!ception eM V /ystem.out.printlnLeM$ W trueM$

W W

S-ar putea să vă placă și