Παράσταση δεδομένων με XML, JSON και κανονικές εκφράσεις

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Σύνταξη κανονικών εκφράσεων

Σύμβολα με ειδικό νόημα

Πρόσθετα σύμβολα με ειδικό νόημα

Χαρακτήρες διαφυγής

Πρόσθετοι χαρακτήρες διαφυγής

Χρήση κανονικών εκφράσεων

Παράδειγμα: Εύρεση κανονικών εκφράσεων σε αρχείο


/*
 * Globally match regular expression and print
 * Modelled after the Unix command with the same name
 * D. Spinellis, January 2004-2024
 */

import java.util.regex.*;
import java.io.*;

class Grep {
    public static void main(String args[]) {
        if (args.length != 2) {
            System.err.println("Usage: Grep pattern file");
            System.exit(1);
        }

        try (var in = new BufferedReader(new InputStreamReader(
                        new FileInputStream(args[1])))) {
            Pattern compiledRe = Pattern.compile(args[0]);
            String s;
            while ((s = in.readLine()) != null) {
                Matcher m = compiledRe.matcher(s);
                if (m.find())
                    System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            System.err.println("Unable to open file " + args[1] + ": " + e.getMessage());
            System.exit(2);
        } catch (PatternSyntaxException e) {
            System.err.println("Invalid RE syntax: " + e.getDescription());
            System.exit(3);
        } catch (IOException e) {
            System.err.println("Error reading line: " + e.getMessage());
            System.exit(4);
        }
    }
}

Αποτέλεσμα αναζήτησης κανονικών εκφράσεων

java Grep "abo" /usr/dict/words
...
sabotage
seaboard
taboo
thereabouts
turnabout
vagabond
whereabout
...

java Grep "^abo" /usr/dict/words
aboard
abode
abolish
abolition
abominable
abominate
aboriginal

java Grep bent /usr/dict/words
absorbent
bent
benthic
debenture
incumbent
recumbent

java Grep "bent$" /usr/dict/words
absorbent
bent
incumbent
recumbent

java Grep "[^AEIOUYaeiouy]{5,}" /usr/dict/words
angstrom
Armstrong
birthplace
bremsstrahlung
corkscrew
Dijkstra
downstream
hardscrabble
jockstrap
Knightsbridge
lengthly
Nietzsche
nightclub
offspring
postscript
Rothschild
...

java Grep "(.)(.)(.)\3\2\1" /usr/dict/words
braggart
Brenner
collocation
diffident
dissident
glossolalia
grammar
grammarian
installation
staccato
suffuse

Διαίρεση συμβολοσειρών με πρότυπο

Διαίρεση συμβολοσειρών με κανονική έκφραση

Όταν τα τμήματα μιας συμβολοσειράς χωρίζονται από ίδια στοιχεία διαχωρισμού (π.χ. :, κενό, tab) τότε μπορούμε να τα διαχωρίσουμε με τη μέθοδο του αντικειμένου Pattern.

import java.io.*;
import java.util.regex.*;

public class SplitWords {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: SplitWords file");
            System.exit(1);
        }

        // Split on non-word characters
        Pattern splitPattern = Pattern.compile("[^a-zA-Z]+");

        try (var in = new BufferedReader(new InputStreamReader(
                        new FileInputStream(args[0])))) {
            String line;
            while ((line = in.readLine()) != null) {
                String[] words = splitPattern.split(line);
                for (String word : words) {
                    System.out.println(word);
                }
            }
        } catch (FileNotFoundException e) {
            System.err.println("Unable to open file " + args[0] + ": " + e.getMessage());
            System.exit(2);
        } catch (IOException e) {
            System.err.println("Error reading line: " + e.getMessage());
            System.exit(3);
        }
    }
}

Παράδειγμα: επεξεργασία αρχείων καταγραφής πρόσβασης σε ιστοσελίδες


/*
 * Collect and print Web statistics
 * D. Spinellis, 2004-2024
 */

import java.util.*;
import java.util.regex.*;
import java.io.*;

class WebStats {

    /**
     * Increment the integer value of map's member by 1
     * The member is obtained by using the matcher to extract
     * the specified group from the string s
     */
    static void increment(Map<String, Integer> map, String s, Matcher m, int group) {
	String member = s.substring(m.start(group), m.end(group));
	Integer i = map.get(member);
        map.put(member, i == null ? 1 : i + 1);
    }

    /** List the contents of the given map */
    static void list(String title, Map<String, Integer> map) {
	System.out.println("\n" + title);
	for (Map.Entry e : map.entrySet())
	    System.out.println(e.getValue() + " " + e.getKey());
    }

    /** List the contents of the given map ordered by their values.
     * (You are not expected to undestand this).
     */
    static void sortedList(String title, Map<String, Integer> map) {
	System.out.println("\n" + title);
	var valueOrder = new TreeSet<Map.Entry<String, Integer>>(new
	    Comparator<Map.Entry<String, Integer>>() {
		public int compare(Map.Entry<String, Integer> a,
			Map.Entry<String, Integer> b) {
		    return (-a.getValue().compareTo(b.getValue()));
		}
	    }
	);
	valueOrder.addAll(map.entrySet());
	for (Map.Entry e : valueOrder)
	    System.out.println(e.getValue() + " " + e.getKey());
    }



    public static void main(String args[]) {
	if (args.length != 1) {
	    System.err.println("Usage: WebStats file");
	    System.exit(1);
	}

	Pattern cre = null;	// Compiled RE
	try {
	    // A standard log line is a line like:
	    // 192.168.136.16 - - [26/Jan/2004:19:45:48 +0200] "GET /c136.html HTTP/1.1" 200 1674 "http://office/c120.html" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20031007"
	    String patternString = """
                ([-\\w.]+)\\s+      # 1. Host
                ([-\\w]+)\\s+       # 2. Logname
                ([-\\w]+)\\s+       # 3. User
                \\[(\\d+)/          # 4. Date
                (\\w+)/             # 5. Month
                (\\d+):             # 6. Year
                (\\d+):             # 7. Hour
                (\\d+)              # 8. Minute
                ([^]]+?)\\]\\s+     # 9. Rest of time
                \"([-\\w]+)\\s*     # 10. Request verb
                ([^\\s]*)           # 11. Request URL
                ([^\"]*?)\"\\s+     # 12. Request protocol etc.
                (\\d+)\\s+          # 13. Status
                ([-\\d]+)\\s+       # 14. Bytes
                \"([^\"]*)\"\\s+    # 15. Referrer URL
                \"([^\"]*)\"        # 16. Client
	    """;
	    cre = Pattern.compile(patternString, Pattern.COMMENTS);
	} catch (PatternSyntaxException e) {
	    System.err.println("Invalid RE syntax: " + e.getDescription());
	    System.exit(1);
	}

	BufferedReader in = null;
	try {
	    in = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));
	} catch (FileNotFoundException e) {
	    System.err.println("Unable to open file " + args[1] + ": " + e.getMessage());
	    System.exit(1);
	}

	var host = new HashMap<String, Integer>();
	var hour = new HashMap<String, Integer>();
	var request = new HashMap<String, Integer>();
	var referrer = new HashMap<String, Integer>();
	try {
	    String s;
	    while ((s = in.readLine()) != null) {
		Matcher m = cre.matcher(s);
		if (!m.matches())
		    System.out.println("Invalid line: " + s);
		else {
		    increment(host, s, m, 1);
		    increment(hour, s, m, 7);
		    increment(request, s, m, 11);
		    increment(referrer, s, m, 15);
		}
	    }
	} catch (Exception e) {
	    System.err.println("Error reading line: " + e.getMessage());
	    System.exit(1);
	}
	sortedList("Host Access Counts", host);
	sortedList("Hourly Access Counts", hour);
	sortedList("Request URL Access Counts", request);
	sortedList("Referrer URL Access Counts", referrer);
    }
}

Υλοποίηση αναγνώρισης κανονικών εκφράσεων

Μηχανή μετάπτωσης καταστάσεων για αναγνώριση της κανονικής έκφρασης (ΔΕΤ!+)|(ΔΕΟΣ) State machine example (Υλοποιείται από 9 άτομα.)

Επιλογή ανάμεσα σε JSON και XML

O μορφότυπος JSON

Σύνταξη JSON


{
    "name": "John",
    "age": 30,
    "isStudent": false,
    "courses": ["Math", "Science"],
    "address": {
        "city": "Athens",
        "country": "Greece"
    }
}

Βασικοί τύποι δεδομένων σε JSON

Ενσωμάτωση JSON στη Java

Ανάγνωση και δημιουργία δεδομένων JSON


package gr.aueb.dmst.dds.example;

import com.google.gson.Gson;

record Person(String name, int age) {}

public class JsonIO {
    public static void main(String[] args) {
        Gson gson = new Gson();

	// Read a JSON object
        String json = "{\"name\":\"Anna\", \"age\":25}";
        Person person = gson.fromJson(json, Person.class);
        System.out.println("Read Person: " + person);

	// Serialize a Java object into JSON
        String serializedJson = gson.toJson(person);
        System.out.println("Serialized JSON: " + serializedJson);
    }
}

Βέλτιστες πρακτικές

Βάσεις της XML

Έγγραφα XML

Παραδείγματα XML

Παράδειγμα: ένα στοιχείο με κείμενο


<city>Larisa</city>

Παράδειγμα: στοιχείο με περιεχόμενο άλλα στοιχεία


 <?xml version="1.0" encoding="US-ASCII" ?>
 <city_info>
    <name>Larisa</name>
    <area_code>241</area_code>
    <latitude>39.38</latitude>
    <longitude>-22.25</longitude>
    <country>Greece</country>
 </city_info>

Παράδειγμα: κενό στοιχείο


<alumnus />
Ηλεκτρονικό τιμολόγιο (https://docs.oasis-open.org/ubl/os-UBL-2.1/xml/UBL-Invoice-2.1-Example.xml)

Προσδιορισμοί

Παράδειγμα:
<city country="el" id="HER">
<name>Hrakleio</name>
</city>

Οντότητες και σχόλια

Οι παρακάτω οντότητες (entities) μπορούν να οριστούν περιφραστικά:
ΟντότηταΣύνταξη XML
<&lt;
&&amp;
>&gt;
"&quot;
'&apos;

Σχόλια μέσα σε ένα έγγραφο XML γράφονται ως
<!-- περιεχόμενο -->

Διάκριση μεταξύ οντοτήτων, στοιχείων και προσδιορισμών

Παράδειγμα: ΚΑΔ XML

Τα παρακάτω αρχείο χρησιμοποιείται από τους φορολογούμενους για να δηλώσουν στη ΑΑΔΕ τον κωδικό αριθμό δραστηριότητάς (ΚΑΔ) τους.
<?xml version="1.0" encoding="UTF-8"?>
<ekad xmlns="http://www.gsis.gr/ekad"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  afm="046523469">
    <branch aa="0">
        <kad typeOfKad="1">
            <value>71121908</value>
        </kad>
    </branch>
</ekad>

Ορισμός σχήματος εγγράφων με τη χρήση XSD

Σχήμα για απλά στοιχεία

Στοιχεία XML που περιέχουν απλά δεδομένα όπως το παρακάτω
<?xml version="1.0" ?>
<studentID>802345</studentID>
μπορούν να δηλωθούν με το στοιχείο element και τον προσδιορισμό του τύπου.
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="studentID" type="xsd:integer" />
</xsd:schema>

Διαθέσιμοι τύποι

Μερικοί διαθέσιμοι τύποι είναι οι παρακάτω:

Περιορισμοί σε απλά στοιχεία

Αν θέλουμε να περιορίσουμε το περιεχόμενο του στοιχείου, μπορούμε να χρησιμοποιήσουμε τα στοιχεία simpleType και restriction μαζί με διάφορους περιορισμούς (restrictions) (στο παράδειγμα pattern).
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="studentID" >
        <xsd:simpleType>
            <xsd:restriction base="xsd:integer">
                <xsd:pattern value="80\d{4}" />
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:element>
</xsd:schema>

Είδη περιορισμών

Μερικοί υποστηριζόμενοι περιορισμοί είναι οι παρακάτω: Όλοι παίρνουν μια παράμετρο value, που ορίζει την τιμή τους.

Παραδείγματα περιορισμών

Παράδειγμα σχήματος για βαθμό:
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="grade" >
                <xsd:simpleType>
                  <xsd:restriction base="xsd:float">
                    <xsd:pattern value="\d+\.[05]"/>
                    <xsd:minInclusive value="0"/>
                    <xsd:maxInclusive value="10"/>
                  </xsd:restriction>
                </xsd:simpleType>
        </xsd:element>
</xsd:schema>
Παράδειγμα περιορισμού για επιλογή μιας πόλης:
<xsd:simpleType>
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="Athens"/>
    <xsd:enumeration value="Thessaloniki"/>
    <xsd:enumeration value="Argostoli"/>
    <xsd:enumeration value="Volos"/>
    <!-- ... -->
  </xsd:restriction>
</xsd:simpleType>

Σύνθετοι τύποι

Ορισμοί προσδιορισμών

Απλό περιεχόμενο

Παράδειγμα απλού περιεχομένου

Παράδειγμα σχήματος:

<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="country">
  <xsd:complexType>
    <xsd:simpleContent >
        <xsd:extension base="xsd:string" >
            <xsd:attribute name="code" type="xsd:string" use="required" />
        </xsd:extension>
    </xsd:simpleContent >
  </xsd:complexType>
</xsd:element>
</xsd:schema>
Παράδειγμα εγγράφου:

<?xml version="1.0" ?>
<country code="el">Greece</country>

Ομάδες

Σε ένα στοιχείο complexType μπορούμε να ορίσουμε και τα παρακάτω στοιχεία

Παράδειγμα ομάδων

Παράδειγμα σχήματος:

<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="javaProgram">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="package" type="xsd:string" />
                <xsd:element name="import" type="xsd:string" maxOccurs="unbounded" />
                <xsd:element name="class">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="name" type="xsd:string" />
                            <xsd:choice maxOccurs="unbounded">
                                <xsd:element name="field" type="xsd:string" />
                                <xsd:element name="ctor" type="xsd:string" />
                                <xsd:element name="method" type="xsd:string" />
                            </xsd:choice>
                        </xsd:sequence>
                        <xsd:attribute name="extends" type="xsd:string" use="optional" />
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
Παράδειγμα εγγράφου:

<?xml version="1.0" ?>
<javaProgram>
        <package>gr.aueb.dds.bio</package>
        <import>java.util.Date</import>
        <import>java.math.BigDecimal</import>
        <class extends="Object">
                <name>Point</name>
                <field>int x</field>
                <field>int y</field>
                <ctor>Point(int x, int y)</ctor>
                <field>static int numPoints</field>
        </class>
</javaProgram>

Αριθμητικοί περιορισμοί

Παράδειγμα: Μια τάξη μπορεί να έχει 10-150 φοιτητές.
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="class" >
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="student" type="xsd:string"
                 minOccurs="10" maxOccurs="150" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Ανακεφαλαίωση

Η επιτρεπόμενη δομή ενός εγγράφου XSD εμφανίζεται στο παρακάτω σχήμα.
the content models in an XML Schema
(Αναδημοσιεύεται με την άδεια του συγγραφέα Rahul Srivastava).

Παράδειγμα: ΚΑΔ XSD

Τα παρακάτω σχήμα ορίζει τη μορφή του αρχείου που χρησιμοποιείται από τους φορολογούμενους για να δηλώσουν στη ΑΑΔΕ τον κωδικό αριθμό δραστηριότητάς (ΚΑΔ) τους.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.gsis.gr/ekad" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.gsis.gr/ekad" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="ekad">
    <xs:annotation>
      <xs:documentation>root element</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element name="branch" nillable="false" maxOccurs="unbounded">
          <xs:annotation>
            <xs:documentation>Εγκατάσταση</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element name="kad" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="value" nillable="false">
                      <xs:annotation>
                        <xs:documentation>Η τιμή του ΚΑΔ</xs:documentation>
                      </xs:annotation>
                      <xs:simpleType>
                        <xs:restriction base="xs:integer">
                          <xs:totalDigits value="15"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="typeOfKad" use="required">
                    <xs:annotation>
                      <xs:documentation>Είδος ΚΑΔ (δραστηριότητας). 1=Κύρια, 2=Δευτερεύουσα, 3=Λοιπή, 4=Βοηθητική</xs:documentation>
                    </xs:annotation>
                    <xs:simpleType>
                      <xs:restriction base="xs:int">
                        <xs:enumeration value="1"/>
                        <xs:enumeration value="2"/>
                        <xs:enumeration value="3"/>
                        <xs:enumeration value="4"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="aa" use="required">
              <xs:annotation>
                <xs:documentation>ΑΑ εγκατάστασης. Η έδρα δηλώνεται σαν υποκατάστημα με ΑΑ=0. Εάν υπάρχει μητρική εταιρεία στο εξωτερικό, ο ΚΑΔ της δηλώνεται ως υποκατάστημα με ΑΑ=9999</xs:documentation>
              </xs:annotation>
              <xs:simpleType>
                <xs:restriction base="xs:int">
                  <xs:minInclusive value="0"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="afm" use="required">
        <xs:annotation>
          <xs:documentation>ΑΦΜ υπόχρεου</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="9"/>
            <xs:maxLength value="9"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
</xs:schema>

Μετασχηματισμοί με τη χρήση XSLT

Στοιχεία της XSLT

Παράδειγμα μετασχηματισμού: σχήμα

<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="project">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="shortname" type="xsd:string" />
                <xsd:element name="projtitle" type="xsd:string" />
                <xsd:element name="startdate" type="xsd:date" minOccurs="0" />
                <xsd:element name="enddate" type="xsd:date" />
                <xsd:element name="web_site" type="xsd:string" minOccurs="0" />
                <xsd:element name="our_budget" type="xsd:integer" minOccurs="0" />
                <xsd:element name="total_budget" type="xsd:integer" minOccurs="0" />
                <xsd:element name="funding_agency" type="xsd:string" minOccurs="0" />
                <xsd:element name="funding_programme" type="xsd:string" minOccurs="0" />
                <xsd:element name="project_code" type="xsd:string" minOccurs="0" />
                <xsd:element name="partner" minOccurs="0" maxOccurs="unbounded">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="shortname" type="xsd:string" />
                            <xsd:element name="country" type="xsd:string" />
                            <xsd:element name="web_site" type="xsd:string" minOccurs="0" />
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="logo" type="xsd:string" minOccurs="0" />
                <xsd:element name="description" type="xsd:string" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Παράδειγμα μετασχηματισμού: έγγραφο

<?xml version="1.0"?>
<project>
        <shortname>mExpress</shortname>
        <projtitle>mobile in-EXhibition PRovision of Electronic Support Services</projtitle>
        <startdate>2002-03-05</startdate>
        <enddate>2004-04-01</enddate>
        <web_site>http://mexpress.intranet.gr/</web_site>
        <our_budget>328</our_budget>
        <total_budget>3493</total_budget>
        <funding_agency>European Commission</funding_agency>
        <funding_programme>IST</funding_programme>
        <project_code>IST-2001-33432</project_code>
        <partner>
                <shortname>Intracom</shortname>
                <country>EL</country>
                <web_site>http://www.intracom.gr</web_site>
        </partner>
        <partner>
                <shortname>Ericsson</shortname>
                <country>DK</country>
                <web_site>http://www.ericsson.com/</web_site>
        </partner>
        <partner>
                <shortname>ELISA</shortname>
                <country>FIN</country>
                <web_site>http://www.elisa.com</web_site>
        </partner>
        <partner>
                <shortname>POULIADIS</shortname>
                <country>EL</country>
                <web_site>http://www.pouliadis.gr</web_site>
        </partner>
        <partner>
                <shortname>SSF</shortname>
                <country>FIN</country>
                <web_site>http://www.ssf.fi/</web_site>
        </partner>
        <partner>
                <shortname>HUT</shortname>
                <country>FIN</country>
                <web_site>http://www.hut.fi</web_site>
        </partner>
        <partner>
                <shortname>FFC</shortname>
                <country>FIN</country>
        </partner>
        <partner>
                <shortname>ROTA</shortname>
                <country>EL</country>
                <web_site>http://www.rota.gr</web_site>
        </partner>
        <logo>../images/p_mexpress.gif</logo>
        <description>
mEXPRESS aims to exploit the technological opportunities arising from
evolution in the areas of wireless networks and positioning mechanisms in
order to support and facilitate the professional exhibition industry in
a context-aware manner. It will contribute to the economic development of
the Community by providing means for efficient operation and interaction
in information-rich environments such as exhibitions, and significantly
enhancing promotional activities and business communications. The mEXPRESS
project will provide an integrated mediation platform (mEXPRESS Service
Provider) oriented to exhibition shows and events.
        </description>
</project>

Παράδειγμα μετασχηματισμού: XSLT

<?xml version="1.0"?>
<!-- Apply using
xml tr project.xslt mexpress.xml
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="project">
                <h1>
                <xsl:value-of select="shortname" />
                -
                <xsl:value-of select="projtitle" />
                </h1>
                <!-- Show Logo -->
                <xsl:element name="img">
                        <xsl:attribute name="src"><xsl:value-of select="logo" /></xsl:attribute>
                </xsl:element>
                <br /> <br />
                <!-- Project Summary information -->
                <xsl:if test="count(project_code) != 0">
                        Project Code:
                        <xsl:value-of select="project_code" />
                        <xsl:if test="@international = 'yes'">
                                (International)
                        </xsl:if>
                        <br/>
                </xsl:if>
                <xsl:if test="count(funding_programme) != 0">
                        Funding programme: <xsl:value-of select="funding_programme" />
                        <br />
                </xsl:if>
                <xsl:if test="count(funding_agency) != 0">
                        Funding Agency: <xsl:value-of select="funding_agency" />
                        <br />
                </xsl:if>
                <xsl:if test="@type != ''">
                        Project type:
                        <xsl:choose>
                                <xsl:when test="@type = 'rtd'">RTD</xsl:when>
                                <xsl:when test="@type = 'consulting'">Consulting</xsl:when>
                                <xsl:when test="@type = 'training'">Training</xsl:when>
                                <xsl:when test="@type = 'dissemination'">Dissemination</xsl:when>
                        </xsl:choose>
                        <br />
                </xsl:if>
                <xsl:if test="count(web_site) != 0">
                        Web site:
                        <xsl:element name="a">
                                <xsl:attribute name="href"><xsl:value-of select="web_site"/></xsl:attribute>
                                <xsl:value-of select="web_site" />
                        </xsl:element>
                        <br />
                        <br />
                </xsl:if>
                <xsl:if test="count(our_budget) != 0">
                        ELTRUN budget: <xsl:value-of select="our_budget" /> EUR
                        <br />
                </xsl:if>
                <xsl:if test="count(total_budget) != 0">
                        Total budget: <xsl:value-of select="total_budget" /> EUR
                        <br />
                </xsl:if>
                <br />
        </xsl:template>
</xsl:stylesheet>

Παράδειγμα μετασχηματισμού: αποτέλεσμα

mExpress - mobile in-EXhibition PRovision of Electronic Support Services



Project Code: IST-2001-33432 (International)
Funding programme: IST
Funding Agency: European Commission
Project type: RTD
Web site: http://mexpress.intranet.gr/ (http://mexpress.intranet.gr/)

ELTRUN budget: 328 EUR
Total budget: 3493 EUR

Το μοντέλο αντικειμένων εγγράφων

Μέθοδοι της NodeList

Η υλοποίηση του μοντέλου αντικειμένων εγγράφων στη Java

Κλήσεις μέσω της διεπαφής Document

Παράδειγμα: υπολογισμός μέσου όρου

import javax.xml.parsers.*;
import java.io.*;
import org.w3c.dom.*;

class Average {
    public static void main(String args[]) {

        if (args.length != 2) {
            System.err.println("Usage: Average element file");
            System.exit(1);
        }

        Document doc = null;
        try {
            // Create the DocumentBuilderFactory
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            // Create the document builder
            DocumentBuilder db = dbf.newDocumentBuilder();
            // Create DOM document from the file
            doc = db.parse(new File(args[1]));
        } catch (Exception e) {
            System.err.println("Parsing failed: " + e);
            System.exit(1);
        }

        NodeList nodes = doc.getElementsByTagName(args[0]);
        double sum = 0.0;
        for (int i = 0; i < nodes.getLength(); i++) {
            String grade = nodes.item(i).getFirstChild().getNodeValue();
            sum += (Integer.valueOf(grade)).doubleValue();
        }
        System.out.println(sum / nodes.getLength());
    }
}

Αποτέλεσμα υπολογισμού

Η εκτέλεση στο αρχείο
<result_list>
    <result>
        <id>809678</id>
        <grade>9</grade>
    </result>
    <result>
        <id>809630</id>
        <grade>8</grade>
    </result>
    <result>
        <id>809679</id>
        <grade>10</grade>
    </result>
    <result>
        <id>809673</id>
        <grade>6</grade>
    </result>
</result_list>
γίνεται ως εξής.
java Average grade grade.xml
8.25

Άσκηση: Περιγραφή δεδομένων με XML και κανονικές εκφράσεις

Άσκηση 10

Μπορείτε να κατεβάσετε το αντίστοιχο αρχείο και να στείλετε τους βαθμούς σας από τους δεσμούς που βρίσκονται στη σελίδα των ασκήσεων.

Βιβλιογραφία

Παράρτημα: Ορισμός τύπου εγγράφων με τη χρήση DTD

Υποστηρίζονται οι παρακάτω ορισμοί:
Απλοί χαρακτήρες (parsed character data)
<!ELEMENT name (#PCDATA)>
Ένα στοιχείο
<!ELEMENT student (person_data)>
Ακολουθία στοιχείων
<!ELEMENT person_data (name, surname)>
Κανένα ή ένα στοιχείο
<!ELEMENT person_name (given_name, initial?, last_name)>
Μηδέν ή περισσότερα στοιχεία
<!ELEMENT owned_cars (car*)>
Ένα ή περισσότερα στοιχεία
<!ELEMENT course_lecturer (person_data+)>
Επιλογή στοιχείων
<!ELEMENT engine (two_stroke | four_stroke | wankel | rotary)>
Χρήση παρενθέσεων
<!ELEMENT person_details (name, surname, (vat_number | id_number))>
Κενό περιεχόμενο
<!ELEMENT alumnus EMPTY>
Τυχαίο περιεχόμενο
<!ELEMENT text ANY>

Παράδειγμα - DTD

<!--
 -
 - Document Type Description for the projects
 -
 - $Id: project.dtd,v 1.2 2004/01/24 20:20:04 bkarak Exp $
 -
-->
<!ELEMENT project (
    shortname, 
    projtitle, 
    startdate?, 
    enddate, 
    web_site?, 
    our_budget?, 
    total_budget?, 
    funding_agency?, 
    funding_programme?, 
    project_code?, 
    partner*, 
    logo?, 
    description
)>

<!ELEMENT projtitle (#PCDATA)>
<!ELEMENT our_budget (#PCDATA)>
<!ELEMENT total_budget (#PCDATA)>
<!ELEMENT funding_agency (#PCDATA)>
<!ELEMENT funding_programme (#PCDATA)>
<!ELEMENT project_code (#PCDATA)>
<!ELEMENT web_site (#PCDATA)>
<!ELEMENT startdate (#PCDATA)>
<!ELEMENT enddate (#PCDATA)>
<!ELEMENT shortname (#PCDATA)>
<!ELEMENT logo (#PCDATA)>
<!ELEMENT description (#PCDATA)>

<!ELEMENT partner (shortname, country, web_site?)>
<!ELEMENT shortname (#PCDATA)>
<!ELEMENT country (#PCDATA)>

Παράδειγμα - αντίστοιχη XML

<?xml version="1.0"?>
<project>
    <shortname>mExpress</shortname>
    <projtitle>mobile in-EXhibition PRovision of Electronic Support Services</projtitle>
    <startdate>20020305</startdate>
    <enddate>20040401</enddate>
    <web_site>http://mexpress.intranet.gr/</web_site>
    <our_budget>328 EUR</our_budget>
    <total_budget>3,493 EUR</total_budget>
    <funding_agency>European Commission</funding_agency>
    <funding_programme>IST</funding_programme>
    <project_code>IST-2001-33432</project_code>
    <partner>
        <shortname>Intracom</shortname>
        <country>EL</country>
        <web_site>http://www.intracom.gr</web_site>
    </partner>
    <partner>
        <shortname>Ericsson</shortname>
        <country>DK</country>
        <web_site>http://www.ericsson.com/</web_site>
    </partner>
    <partner>
        <shortname>ELISA</shortname>
        <country>FIN</country>
        <web_site>http://www.elisa.com</web_site>
    </partner>
    <partner>
        <shortname>POULIADIS</shortname>
        <country>EL</country>
        <web_site>http://www.pouliadis.gr</web_site>
    </partner>
    <partner>
        <shortname>SSF</shortname>
        <country>FIN</country>
        <web_site>http://www.ssf.fi/</web_site>
    </partner>
    <partner>
        <shortname>HUT</shortname>
        <country>FIN</country>
        <web_site>http://www.hut.fi</web_site>
    </partner>
    <partner>
        <shortname>FFC</shortname>
        <country>FIN</country>
    </partner>
    <partner>
        <shortname>ROTA</shortname>
        <country>EL</country>
        <web_site>http://www.rota.gr</web_site>
    </partner>
    <logo>../images/p_mexpress.gif</logo>
    <description>
mEXPRESS aims to exploit the technological opportunities arising from
evolution in the areas of wireless networks and positioning mechanisms in
order to support and facilitate the professional exhibition industry in
a context-aware manner. It will contribute to the economic development of
the Community by providing means for efficient operation and interaction
in information-rich environments such as exhibitions, and significantly
enhancing promotional activities and business communications. The mEXPRESS
project will provide an integrated mediation platform (mEXPRESS Service
Provider) oriented to exhibition shows and events.
    </description>
</project>

Παράρτημα: Ορισμός τύπων προσδιορισμών με τη χρήση DTD

Οι προδιορισμοί που επιτρέπονται σε ένα στοιχείο ορίζονται με στοιχεία της μορφής
<!ATTLIST όνομα_στοιχείου
    όνομα_προσδιορισμού τύπος_προσδιορισμού περιορισμός
    ...
>
Υποστηρίζονται μεταξύ άλλων οι παρακάτω τύποι προσδιορισμού
Χαρακτήρες
CDATA
Απαρίθμηση
(επιλογή1 | επιλογή2 | ...)
Κλειδί
ID
Αναφορά σε κλειδί
IDREF
Αναφορά σε κλειδιά
IDREFS
Οι πιο χρήσιμοι περιορισμοί προσδιορισμών είναι:
#IMPLIED
Προαιρετικός προσδιορισμός
#REQUIRED
Υποχρεωτικός προσδιορισμός

Παράδειγμα - DTD

<!ATTLIST project
    id ID #REQUIRED
    contact CDATA #IMPLIED
    scientific_coordinator CDATA #IMPLIED
    project_manager CDATA #IMPLIED
    group CDATA #REQUIRED
    international (yes | no) #REQUIRED
    type (consulting | rtd | training | dissemination) #REQUIRED
>

Παράδειγμα - XML

<?xml version="1.0"?>
<project
    id="p_mexpress"
    group="g_sense g_wrc"
    scientific_coordinator="m_dds"
    contact="m_pateli"
    international="yes"
    type="rtd"
    project_manager="m_pateli"
>
<!-- ... -->
</project>

Περιεχόμενα