Omet navegació

Exercicis

Exercici 8.0 (voluntari) (PostgreSQL)

Modifica (ampliant-la) la sentència de l'apartat 3.7 per a guardar en un únic document XML les comarques de la taula COMARQUES. En cada comarca hauran d'aparèixer tots els seu pobles (taula POBLACIONS), i en cada poble tots els seus instituts (taula INSTITUTS).

Exercici 8.1 (voluntari) (PostgreSQL)

Dins de la BD pròpia de cadascú (la mateixa ja utilitzada en el Tema 6; si no tens clar quina és, contacta amb el teu professor) crea una taula anomenada DOC_XML amb 3 camps:

  • num (de tipus serial, que és l'autonumèric) que contindrà el número del document. Ha de ser clau principal.
  • nom (de tipus cadena) que contindrà un nom per al document.
  • doc (de tipus xml) que contindrà els documents XML

Puja la sentència de creació de la taula.

Exercici 8.2 (voluntari) (PostgreSQL)

Fes un programa en Java (en el projecte Tema8_1, en un paquet nou anomenat Exercicis) anomenat Ruta_XML_PostgreSQL que guarde en la taula creada en el punt anterior el contingut del document Rutes.xml ja fet en anteriors exercicis (i que et proporcionarà el professor). El nom del document podria ser Rutes, i el número no li l'has de proporcionar, ja que és un autonumèric.

Exercici 8.3 (voluntari) (PostgreSQL)

Fes un programa dins del mateix projecte i paquet anomenat Vis_Rutes_XML (i el JFrame: Vis_Rutes_XML_Pantalla) que aprofite les llibreries gràfiques Awt i Swing per a mostrar les rutes i els seus punts guardades en la taula DOC_XML del punt anterior, d'una forma molt similar a l'exercici 3.4 del tema 3.

Observa que es tractarà d'accedir al document XML guardat en la Base de Dades PostgreSQL, però no cal guardar tota l'estructura, sinó que és suficient amb la recerca de determinades coses:

  • Per al JComboBox s'han de buscar els noms de les rutes.
  • Per al JArea el nom dels punts de la ruta seleccionada.

Exercici 8.4 (voluntari) (PostgreSQL)

Intenta fer l'exercici 6.5 , però ara accedint als document XML de la Base de Dades PostgreSQL. Anomena'l Vis_Rutes_XML_PostgreSQL_Complet

Intenta traure concusions sobre quina manera és més còmoda.

Exercici 8.5 (eXist)

Realitzar les expressions XPath que tornen les següents qüestions (totes elles sobre Rutes.xml):

  1. Traure el nom de totes les rutes.
  2. Traure el nom de les rutes amb un desnivell major que 600 m.
  3. Traure les rutes en les quals el desnivell acumulat duplica el desnivell. (Observació: quan en una condició combinem alguna operació amb una comparació, és millor posar l'operació abans de l'operador de comparació)
  4. Traure el nom del primer punt de cada ruta.
  5. Traure el nom de l'últim punt de cada ruta
  6. Traure els punts de la tercera ruta.
  7. Traure el número de punts de la tercera ruta
  8. Traure el nom de les rutes que tenen estrictament més de 5 punts.
  9. Traure la mitjana de desnivell de les rutes
  10. Traure les rutes en les quals hi ha alun punt més avall del paral·lel 40

Exercici 8.6 (eXist)

Fer les expressions XQuery per a aconsequir:

1. El mòdul amb el nom del professor com a atribut:

<modul professor="Joan Puig">Llenguatges de Marques</modul>

2. El nom de cada ruta amb el número de punts com a argument:

<rutes>
<ruta numPunts="5">Pujada a Penyagolosa</ruta>
<ruta numPunts="7">La Magdalena</ruta>
<ruta numPunts="6">Pelegrins de Les Useres</ruta>
<ruta numPunts="6">Catí - Sant Pere de Castellfort</ruta>
</rutes>

 3. Cada ruta amb el nom com a atribut, la latitud mitjana dels seus punts i la longitud mitjana

<ruta nom="Pujada a Penyagolosa">
<lat_mitj>40.2408508</lat_mitj>
<long_mitj>-0.3515282</long_mitj>
</ruta>
<ruta nom="La Magdalena">
<lat_mitj>40.01264257142857</lat_mitj>
<long_mitj>-0.02034042857142857</long_mitj>
</ruta>
...

 4. La mitjana de punts de les rutes

6

5. Quants punts de cada ruta estan en l'hemisferi est (és a dir, longitud positiva)

Pujada a Penyagolosa: 0
La Magdalena: 0
Pelegrins de Les Useres: 0
Catí - Sant Pere de Castellfort: 2

 

Exercici 8.7 (eXist)

En el projecte Tema8_2, i en un paquet nou anomenat Exercicis, fer un programa similar a l'exercici 6.4, però aquesta vegada accedint a la Base de Dades  XML-Nativa eXist:

En aquesta ocasió la connexió serà permanent, fins apretar el botó de tancar. Observeu com els objectes s (XQDataSource), conn (XQConnection) i rs (XResultSequence) estan declarats al principi per no perdre la connexió.

Ens aprofitarem dels mètodes de moviment (first(), previous(), next(), last()) per a menejar-nos d'una ruta a una altra, i per tant s'ha de poder permetre el moviment cap avant i cap arrere.

Observeu com el mètode plenar_taula(element) ha canviat. Us pot servir de model per a emplenar les altres coses, i observeu com se li ha de passar un element DOM (l'element punts).

Aquest classe es pot dir Vis_Rutes_XML_eXist_Pantalla.java. I recordeu que heu de tenir una altra classe amb el mètode main que invoque a Vis_Rutes_XML_eXist_Pantalla.iniciar()

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQConstants;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;
import javax.xml.xquery.XQStaticContext;
 
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
 
import net.xqj.exist.ExistXQDataSource;
 
 
public class Vis_Rutes_XML_eXist_Pantalla extends JFrame implements ActionListener {
 
private static final long serialVersionUID = 1L;
 
XQDataSource s;
XQConnection conn;
XQResultSequence rs;
 
JLabel etiqueta = new JLabel("");
JLabel etNom = new JLabel("Ruta:");
JTextField qNom = new JTextField(15);
JLabel etDesn = new JLabel("Desnivell:");
JTextField qDesn = new JTextField(5);
JLabel etDesnAcum = new JLabel("Desnivell acumulat:");
JTextField qDesnAcum = new JTextField(5);
JLabel etPunts = new JLabel("Punts:");
JTable punts = new JTable(1,3);
JButton primer = new JButton("<<");
JButton anterior = new JButton("<");
JButton seguent = new JButton(">");
JButton ultim = new JButton(">>");
JButton tancar = new JButton("Tancar");
 
// en iniciar posem un contenidor per als elements anteriors
public void iniciar() throws XQException {
getContentPane().setLayout(new GridLayout(0,1));
JPanel p_prin = new JPanel();
p_prin.setLayout(new BoxLayout(p_prin, BoxLayout.Y_AXIS));
// contenidor per als elements
JPanel panell1 = new JPanel(new GridLayout(0,2));
panell1.add(etNom);
qNom.setEditable(false);
panell1.add(qNom);
panell1.add(etDesn);
qDesn.setEditable(false);
panell1.add(qDesn);
panell1.add(etDesnAcum);
qDesnAcum.setEditable(false);
panell1.add(qDesnAcum);
panell1.add(etPunts);
 
JPanel panell2 = new JPanel(new GridLayout(0,1));
punts.setEnabled(false);
JScrollPane scroll = new JScrollPane(punts);
panell2.add(scroll, null);
 
JPanel panell5 = new JPanel(new FlowLayout());
panell5.add(primer);
panell5.add(anterior);
panell5.add(seguent);
panell5.add(ultim);
panell5.add(tancar);
 
getContentPane().add(p_prin);
p_prin.add(panell1);
p_prin.add(panell2);
p_prin.add(panell5);
 
setVisible(true);
pack();
primer.addActionListener(this);
anterior.addActionListener(this);
seguent.addActionListener(this);
ultim.addActionListener(this);
tancar.addActionListener(this);
 
inicialitzar();
VisRuta();
}
 
private void plenar_taula(Element e_punts){
NodeList ll_punts = e_punts.getElementsByTagName("punt");
 
Object[][] ll= new Object[ll_punts.getLength()][3];
for (int i=0;i<ll_punts.getLength();i++){
Element p=(Element) ll_punts.item(i);
ll[i][0]=p.getElementsByTagName("nom").item(0).getFirstChild().getNodeValue();
ll[i][1]=p.getElementsByTagName("latitud").item(0).getFirstChild().getNodeValue();
ll[i][2]=p.getElementsByTagName("longitud").item(0).getFirstChild().getNodeValue();
}
String[] caps = {"Nom punt","Latitud","Longitud"};
punts.setModel(new javax.swing.table.DefaultTableModel(ll,caps));
}
 
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == primer) {
}
 
if (e.getSource() == anterior) {
}
 
if (e.getSource() == seguent ) {
}
 
if (e.getSource() == ultim) {
}
 
if (e.getSource() == tancar) {
}
}
 
private void inicialitzar() throws XQException {
}
 
private void VisRuta() throws XQException{
}
}