1 / 61

Τεχνολογίες XML

Τεχνολογίες XML. XML και DTD Υποστηρικτικές τεχνολογίες Γλώσσες ερωτήσεων. HTML. Χρησιμοποιεί tags ανάμεσα στο κείμενο... ...για να περιγράψει το layout της σελίδας <p> <b>Alan</b>, 42 years, <i>agb@abc.com</i>

Download Presentation

Τεχνολογίες XML

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Τεχνολογίες XML

  2. XML και DTDΥποστηρικτικές τεχνολογίεςΓλώσσες ερωτήσεων

  3. HTML • Χρησιμοποιεί tagsανάμεσα στο κείμενο... • ...για να περιγράψει το layoutτης σελίδας <p> <b>Alan</b>, 42 years, <i>agb@abc.com</i> • Δεν διευκολύνει άλλα προγράμματα να κατανοήσουν την δομή και το περιεχόμενο μιας σελίδας • Ο wrapper «σπάει» αν το italic <i> αλλάξει σε teletype <t> • Το πρόβλημα είναι οτι σχεδιάστηκε ειδικά για να περιγράψει την παρουσίαση και όχι το περιεχόμενο • Καθένας θα ήθελε να υπάρχει «ένα ακόμη tag» στην HTML προκειμένου να βοηθηθεί η δική του εφαρμογή

  4. XML • Σχεδιάστηκε ειδικά για να περιγράψει το περιεχόμενο (content) και όχι την παρουσίαση μιας σελίδας • Βασικές διαφορές από την HTML • Μπορεί κανείς να ορίσει νέα tagsκατά βούληση • Ενα έγγραφο XML μπορεί προαιρετικά να περιέχει μια περιγραφή της γραμματικής του • Τα tags δομούν το περιεχόμενο <person><name>Kostas</name>…</person> • Το πως θα εμφανιστούν ορίζεται ξεχωριστά από κάποιο stylesheet (XSL)

  5. XML (2) • Ο ρόλος της XML • Προτάθηκε σαν μια markup γλώσσα περιγραφής εγγράφων • Καταγωγή απο την SGML (ψηφιακές βιβλιοθήκες) • Εξελίσσεται όμως σε ένα παγκόσμιο πρότυπο για ανταλλαγή πληροφορίας • Αυτό τράβηξε το ενδιαφέρον της κοινότητας των ΒΔ • Βασικό συστατικό της XML είναι το element • Κείμενο που περικλείεται από ένα ζεύγος tags • Start-tag και end-tag (markups) • Εκτός από την λογική δομή (elements), τα tags περιγράφουν και την φυσική δομή (entities) <person> <name>Alan</name> <age>42</age> <email>alan@abc.com</email> <email>abrown@mail.com</email> </person>

  6. Εlements και tags • Τι μπορεί να υπάρχει ανάμεσα στα start-tag και end-tag; • Απλό κείμενο • Αλλα elements • Οποιοδήποτε μίγμα των δύο παραπάνω ! • Τα tags στην XML: • Ορίζονται από τους χρήστες, δεν υπάρχουν προκαθορισμένα tags όπως στην HTML • Ανοίγουν και κλείνουν πάντα με την «σωστή» σειρά (σαν παρενθέσεις) • Εξαίρεση: empty tag, πχ. <married/> (το / στο τέλος) <married/> = <married></married> • Element, element content, και subelement

  7. XML attributes • Ενα element μπορεί να περιέχει μηδέν ή περισσότερα attributes • Δεν σχετίζονται με τα attributes στις σχεσιακές βάσεις • Περιγράφουν ιδιότητες (properties) του element <product> <name language=“French”>trompette no 6</name> <price currency=“Euro”> 420.12 </price> <address format=“XL1245” language=“French”> <street>31 rue Croix-Bosset</street> <zip>92874</zip> </address> </product> • Οπως και τα elements, τα attributes ορίζονται από τον χρήστη

  8. Attributes και elements • Διαφορές με elements: • Η τιμή του attribute είναι πάντα ένα string σε εισαγωγικά, ενώ το element μπορεί να περιέχει άλλα elements • Ενα element μπορεί να έχει το πολύ ένα attribute με ένα όνομα, ενώ μπορεί να έχει πολλά subelements με το ίδιο όνομα • Τα attributes: • Φανερώνουν την καταγωγή της XML σαν document markup γλώσσας • Εισάγουν κάποια δυσκολία στην ανταλλαγή πληροφορίας: αναπαράσταση σαν attribute ή σαν subelement; <person name=“Alan” age=“42” email=“agb@abc.com”/> <person age=“42”> <name>Alan</name> <email>agb@abc.com</email> </person>

  9. ΧML και ημιδομημένα δεδομένα • Η XML είναι κατάλληλη για την αναπαράσταση ημιδομημένων δεδομένων • ssd-expression: {person: {name: “Alan”, age: 42, email: “agb@abc.com”}} • Αντίστοιχο XML: <person> <name>Alan</name> <age>42</age> <email>agb@abc.com</email> </person> • Διαφορές με ημιδομημένα δεδομένα: • Μοντέλο XML Graph, XML references, διάταξη (order), μίξη elements με κείμενο, επιπλέον στοιχεία της XML

  10. XML Graph • Ενα μοντέλο για XML data: XML Graph • Οι κόμβοι αντιστοιχούν στα elements • Διαφορά με SSD Graph: οι ετικέτες είναι στους κόμβους • Εύκολη η μετατροπή, ιδίως αν έχουμε δένδρο • Μπορούμε να έχουμε γράφο; - ΝΑΙ

  11. XML References • H XML έχει έναν μηχανισμό ώστε ένα element να μπορεί να «δείχνεται» από περισσότερους από έναν «πατέρες» • Ορίζοντας έτσι γράφο αντί για δένδρο • Ο μηχανισμός είναι attributes τύπου ID, IDREF, και IDREFS • Τα ID αναθέτουν ταυτότητες στα elements • Τα IDREF «δείχνουν» στα ID από άλλα elements, οπουδήποτε <state id=“s2” idrefs=“c2c7c12c32”>Nevada</state> ... <city id=“c7”> <cname>Carson City</cname> <state-of idref=“s2”/> </city> • Ποιάattributes είναι τύπου ID / IDREF; • Πάντως όχι κατ’ ανάγκη αυτά που λέγονται id / idref • Αλλά αυτά που ορίζονται από το DTD (στην συνέχεια)

  12. Διάταξη • Τα δύο SSD είναι ισοδύναμα: {person: {firstname: “John”, lastname: “Smith”}} {person: {lastname: “Smith”, firstname: “John”}} • Ενώ τα δύο XML δεν είναι ισοδύναμα: <person><firstname>John</firstname> <lastname>Smith</lastname></person> <person><lastname>Smith</lastname> <firstname>John</firstname></person> • Τα XMLattributes δεν είναι διατεταγμένα • Τα παρακάτω είναι ισοδύναμα: <personfirstname=“John” lastname=“Smith”/> <personlastname=“Smith” firstname=“John”/> • Η απαίτηση για διάταξη δυσκολεύει την αποδοτική διαχείριση των δεδομένων XML • Συχνά η διάταξη αγνοείται σε εφαρμογές ανταλλαγής πληροφορίας

  13. Μίξη elements και κειμένου • Το παρακάτω επιτρέπεται στην XML • Λέμε ότι το person έχει mixed content <person> This is my best friend <name>Alan</name> <age>42</age> I am not too sure about the following email <email>agb@abc.com</email> </person> • Δείχνει την εγγραφο-κεντρική καταγωγή της XML • Κάπως «αφύσικο» από την πλευρά των βάσεων δεδομένων • Προτιμούμε το element content

  14. Επιπλέον στοιχεία της XML • Εγγραφο-κεντρικά στοιχεία που δεν χρειάζονται στην ανταλλαγή δεδομένων • Σχόλια <!– this is comment --> • Processing Instructions <?xml-stylesheet href=“book.css” type=“text/css”?> • Αρχική γραμμή <?xml version=“1.0”?> • Προαιρετικό Document Type Definition (DTD) • Ορίζει την γραμματική του κειμένου <?xml version=“1.0”?> <!DOCTYPE name [markupdeclarations]> <name>…</name>  root element

  15. DTD • Document Type Definition(DTD): αναπόσπαστο μέρος της XML • Προτάθηκε σαν μια γραμματική για τα XML έγγραφα • Σε κάποιο βαθμό μπορεί να θεωρηθεί σαν σχήμα για δεδομένα μορφοποιημένα σε XML • Ενα DTD που περιγράφει δυαδικά δένδρα: <!ELEMENT node (leaf | (node, node))> <!ELEMENT leaf (#PCDATA)> • Τα DTDs μοιάζουν να ορίζουν τύπους δεδομένων <!DOCTYPE db [ <!ELEMENT db (person*)> <!ELEMENT person (name,age,email)> <!ELEMENT name (#PCDATA)> ...]>

  16. Δήλωση attributes στο DTD • Σύνδεση των attributes με τα elements στα οποία εμφανίζονται <product> <name language=“French” department=“Music”>trompette</name> <price currency=“Euro”> 420.12 </price> </product> <!ATTLIST name language CDATA #REQUIRED department CDATA #IMPLIED> <!ATTLIST price currency CDATA #IMPLIED> • Ορισμός των attributes • #REQUIRED υποχρεωτικό, #IMPLIED προαιρετικό • Τύπος CDATA = string • Τύποι ID, IDREF, IDREFS

  17. Well-formed και valid • Well-formed XML έγγραφα • Τα tags πρέπει να είναι σωστά εμφωλιασμένα • Τα attributes ενός element πρέπει να είναι μοναδικά • Valid XML έγγραφο • Είναι well-formed • Εχει κάποιο DTD • Συμμορφώνεται με αυτό το DTD • Περιορισμοί του DTD σαν σχήμα για δεδομένα XML • Δεν υπάρχουν ατομικοί τύποι (πχ. integer) • Δεν υπάρχουν περιορισμοί διαστήματος (πχ. 0-140) • Ο τύπος ενος element είναι global (πχ. ίδιο name και σε person και σε course;) • Δεν προσδιορίζει τον τυπο των IDREFs

  18. XML και DTDΥποστηρικτικές τεχνολογίεςΓλώσσες ερωτήσεων

  19. XML Namespaces • Πρόβλημα: ο τύπος των element είναι global • Το ίδιο έγγραφο πρέπει να μπορεί να χρησιμοποιηθεί από πολλά προγράμματα που καταλαβαίνουν άλλαmarkups • Συγκρούσεις στην ονοματολογία; • Λύση: XML Namespaces = συλλογές ονομάτων <?xml version="1.0" encoding="ISO-8859-15"?> <html> <body> <p>Welcome to my HealthResource</p> </body> <body> <height>6ft</height> <weight>155 lbs</weight> </body> </html>

  20. XML Namespaces • Πρόβλημα: ο τύπος των element είναι global • Το ίδιο έγγραφο πρέπει να μπορεί να χρησιμοποιηθεί από πολλά προγράμματα που καταλαβαίνουν άλλαmarkups • Συγκρούσεις στην ονοματολογία; • Λύση: XML Namespaces = συλλογές ονομάτων <?xml version="1.0" encoding="ISO-8859-15"?> <html> <body> <p>Welcome to my HealthResource</p> </body> <body> <height>6ft</height> <weight>155 lbs</weight> </body> </html> <?xml version="1.0" encoding="ISO-8859-15"?> <html:html xmlns:html='http://www.w3.org/TR/xhtml1/'>> <html:body> <html:p>Welcome to my HealthResource</html:p> </html:body> <health:body xmlns:health='http://www.example.org/health'> <health:height>6ft</health:height> <heatlh:weight>155 lbs</health:weight> </health:body> </html:html>

  21. XML Schema • Αντιμετωπίζει τις ανεπάρκειες του DTD • Ορίζει αυστηρότερα σύνθετους τύπους, με βασικούς τύπους και περιορισμούς • Εκφράζεται και το ίδιο σε ΧΜL • Ενα απόσπασμα: <xsd:complexType name=“PurchaseOrderType”> <xsd:sequence> <xsd:element name=“shipTo” type=“USAddress”/> <xsd:element name=“billTo” type=“xsd:string”/> <xsd:element name=“comments” minOccurs=“0”/> <xsd:element name=“items” type=“Items”/> </xsd:sequence> <xsd:attribute name=“orderDate” type=“xsd:date”/> </xsd:complexType>

  22. XSL • Αποτελείται από τρια ξεχωριστα τμήματα • XSL Formating Objects • Ορίζει το format παρουσίασης ενός εγγράφου XML • XPath: XML Path Language • Επιλέγει τμήματα ενός εγγράφου XML • Απλοποιημένη μορφή, επιστρέφει τα βιβλία σε ένα XML (πίσω): database/biblio/book(ονόματα XML tags) • Επιστρέφει τους πρώτους συγγραφείς των βιβλίων: root()/descendant::book/child::author[position()=first()] • XSLT: XSL Transformation language • Μετατρέπει ένα έγγραφο XML σε κάποιο άλλο έγγραφο

  23. XSLT: παράδειγμα • Μετατρέπει το XML σε έναν HTML κατάλογο των τίτλων των βιβλίων <database id=“db”> <biblio> <book id=“n1”> <author>Roux</author> <author>Combalusier</author> <date>1976</date> <title>Database Systems</title> </book> <book id=“n2”> <author>Smith</author> <date>1999</date> <title>Database Systems</title> </book> <paper>...</paper> </biblio> </database> <xsl:template match=“/”> <html> <head> <title>Book Titles</title> </head> <body> <h1>Book Titles</h1> <xsl:for-each select=“database/biblio/book”> <xsl:value-of select=“title”/> <br></br> </xsl:for-each> </body> </html> </xsl:template>

  24. XML και DTDΥποστηρικτικές τεχνολογίεςΓλώσσες ερωτήσεων

  25. Γλώσσα XQuery • XQuery: γλώσσα επεξεργασίας XML αρχείων • W3C: www.w3c.org • Είναι συναρτησιακή γλώσσα: βασίζεται σε εκφράσεις που επιστρέφουν τιμές. • Χρησιμοποιεί το XML μοντέλο δεδομένων. • Οι εκφράσεις (expressions) XQuery επιστρέφουν μια (διατεταγμένη) σειρά από κόμβους ή τιμές. • Σημαντικό κομμάτι της XQuery είναι οι εκφράσεις μονοπατιών (path expressions). • Τα παραδείγματα που θα ακολουθήσουν βασίζονται στην αναφορά D. Chamberlin, XQuery: an XML Query Language. IBM Systems Journal, 41(4), 2002.

  26. XML Μοντέλο Δεδομένων <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items>

  27. XML Μοντέλο Δεδομένων <?xml version = "1.0"?> <bids> <bid> <itemno> 4</itemno> <bidder> George </bidder> <bid-amount> 150 </bid-amount> <bid-date> 21/5/2005 </bid-date> </bid> <bid> ... </bid> </bids>

  28. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /items • Βρες το root element items (“/”).

  29. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /items/item • Βρες όλα τα elements itemπου είναι παιδιά (‘/’) του root element items (“/”).

  30. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item • Βρες όλα τα elements item (‘//’: απόγονος).

  31. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item/seller • Βρες όλα τα elements seller που είναι παιδιά του item (‘//’: απόγονος).

  32. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item/* • Βρες όλα τα elements που είναι παιδιά του item.

  33. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /item/* • Βρες όλα τα elements που είναι παιδιά του root element item (NULL!).

  34. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //* • Βρες όλα τα elements.

  35. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /*/*/seller • Βρες όλα τα elements sellerπου έχουν 2 προγόνους.

  36. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /items/item[2] • Βρες το 2ο itemπαιδί του element items.

  37. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item[@status] • Βρες όλα τα item elements που έχουν attribute status.

  38. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item[@status=‘new’] • Βρες όλα τα item elements που έχουν attribute status με τιμή ‘new’.

  39. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item[reserve-price>=100] • Βρες όλα τα item elements που έχουν παιδί το reserve-price element και το οποίο έχει value > 100.

  40. <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //items/item[seller=Theo]/description • Βρες όλα τα description elements πουέχουν αδέρφια element item (παιδιά του items) τα οποία έχουν παιδί element seller με τιμή Theo (branching XPATH).

  41. Κατασκευαστές • Οι εκφράσεις μονοπατιών έχουν ένα σημαντικό μειονέκτημα: επιστρέφουν κόμβους. • Θα θέλαμε να υπάρχει δυνατότητα κατασκευής καινούριων element, value, καθορισμού των σχέσεων μεταξύ elements (δηλαδή το αποτέλεσμα να μην είναι μεμονωμένοι κόμβοι, αλλά δέντρο κομμάτι του μοντέλου XML), κ.λ.π. • Για το λόγο αυτό η XQuery παρέχει κατασκευαστές (constructors): • {έκφραση XQuery} • η έκφραση αποτιμάται και η {...} αντικαθίστανται από το αποτέλεσμα.

  42. Κατασκευαστές • Παραδείγματα κατασκευαστών: <highbid> {$b/@status,$b/itemno,$b/bid-amount} </highbid> <highbid status ''{$s}'‘> <itemno>{$i}</itemno> <bid-amount> {max($bids[itemno $i]/bid-amount)} </bid-amount> </highbid>

  43. Iterators (For) • Παράδειγμα For iterator: FOR $m in (2, 3), $n in (5, 10) RETURN <fact> {$m} times {$n} is{$m * $n} </fact> • Αποτέλεσμα <fact>2 times 5 is 10</fact> <fact>2 times 10is 20</fact> <fact>3 times 5 is 15</fact> <fact>3 times 10is 30</fact>

  44. Iterators (For), Δέσιμο Μεταβλητών • Παράδειγμα For iterator με δέσιμο (binding) μεταβλητών: FOR $i in (1 to 3) LET $j := (1 to $i) • Αποτέλεσμα $i = 1, $j = 1 $i = 2, $j = (1, 2) $i = 3, $j = (1, 2, 3) • Το δέσιμο μεταβλητών σε For και Let δίνει την δυνατότητα στην XQuery να διασχίζει το μοντέλο δεδομένων XML και να ψάχνει για πολλαπλά ταιριάσματα.

  45. FLoWeRs! • F: FOR • L: LET • W: WHERE • R: RETURN • FLWR (προφέρεται flower) expressions

  46. Παράδειγμα FLOWER 1 (lily) • Βρες αντικείμενα στα οποία έχουν δοθεί δύο προσφορές. • Ερώτηση: FOR $i in document(''items.xml'')/*/item … … RETURN $i bind

  47. Παράδειγμα FLOWER 1 (lily) • Βρες αντικείμενα στα οποία έχουν δοθεί δύο προσφορές. • Ερώτηση: FOR $i in document(''items.xml'')/*/item LET $b := document(''bids.xml'')/*/bid[itemno = $i/itemno] … RETURN $i bind

  48. Παράδειγμα FLOWER 1 (lily) • Βρες αντικείμενα στα οποία έχουν δοθεί δύο προσφορές. • Ερώτηση: FOR $i in document(''items.xml'')/*/item LET $b := document(''bids.xml'')/*/bid[itemno = $i/itemno] WHERE count ($b) =2 RETURN $i bind

  49. Παράδειγμα FLOWER 1 (lily) <?xml version = "1.0"?> <bids> <bid> <itemno> 1</itemno> <bidder> George </bidder> ... </bid> <bid> <itemno> 1 </itemno> <bidder> Theo </bidder> ... </bid> <bid> <itemno> 2 </itemno> <bidder> George </bidder> ... </bid> </bids> <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 1 </itemno> .... </item> <item status=“old”> <itemno> 2 </itemno> .... </item> <item status=“old”> <itemno> 3 </itemno> .... </item>

  50. Παράδειγμα FLOWER 2 (dahlia) • Για κάθε αντικείμενο στο οποίο έχουν δοθεί παραπάνω από δέκα προσφορές, φτιάξε ένα element popular-item που να περιέχει τον κωδικό του αντικειμένου, την περιγραφή και τον αριθμό των προσφορών.

More Related