XML : Extensible Markup Language

 

Olivier.Corby@sophia.inria.fr

http://www/inria.fr/acacia


 
 

XML    5/3/2004

1/86


 

Java

 

program once, run everywhere


 

XML

 

write once, publish everywhere


 

Plan

 


 

XML : Extensible Markup Language

 

http://www.w3.org/TR/xml

Une boite à outils pour traiter les documents et les données structurés


 

XML et WWW

 


 

XML, SGML & HTML

 


 

XML : un métalangage

 


 

Exemple

 

<slide>
<title>XML : un métalangage</title>
<ul>
	<lip>Générateur de formats d'échange de</lip>
	<ul>
		<lip>données structurées</lip>
		<lip>documents structurés</lip>
	</ul>
	<lip>Séparer : </lip>
	<ul>
		<lip>données structurées</lip>
		<lip>présentation</lip>
	</ul>
	<lip>Un document XML contient la définition de sa structure</lip>
	<lip>Repose sur la modélisation des caractères Unicode</lip>
	<lip>Peut être lu par tout parser XML</lip>
</ul>
</slide>

 

Exemple

 

<book>
<head>
	<title>The General Theory of Employment, Interest and Money</title>
	<author>J. M. Keynes</author>
</head>
<chapter>
	<title>Employment</title>
	<section>...</section>
</chapter>
<chapter>
	...
</chapter>
</book>

 

Exemple

 

<defclass name="Car">
	<defattribute name="mark" type="string"/>
	<defattribute name="age" type="integer"/>
</defclass>

<defobject id='123'>
	<class>Car</class>
	<attribute name='mark'>Renault</attribute>
	<attribute name='age'>1992</attribute>
</defobject>

 

Exemple

 

<lettre>
	<date>17/10/2000</date>
	<objet>Réclamation</objet>
	<politesse>Madame</politesse>
	<para>En réponse à votre lettre du <date>15/12/1998</date>
	   dans laquelle Monsieur <name>Ybroc</name> ...
	</para>
	<salutation/>
</lettre>

 

Exemple

 

<bibliography>

<book id='LCCN-36027176'>

<author>
<firstname>John Maynard</firstname>
<lastname>Keynes</lastname>
</author>

<title>The General Theory of Employment, Interest and Money</title>
<publisher>MacMillan</publisher>
<year>1936</year>
</book>

</bibliography>

 

Structure vs Contenu

 

Un document XML inclu la définition de sa structure sous forme d'arbre.

<bibliography>
<book id='LCCN-36027176'>
        <author><firstname>John Maynard</firstname>
		<lastname>Keynes</lastname>
	</author>
	<title>The General Theory of Employment, Interest and Money</title>
	<publisher>MacMillan</publisher>
	<year>1936</year>
</book>
</bibliography>
bibliography 
   \n
   book id='LCCN-36027176' 
      \n
      author 
         firstname 
            "John Maynard"
         \n
         lastname 
            "Keynes"
         \n
      \n
      title 
         "The General Theory of Employment, Interest and Money"
      \n
      publisher 
         "MacMillan"
      \n
      year 
         "1936"
      \n
   \n

 

XML vs HTML

 


 

Avantages

 


 

Avantages (suite)

 


 

Types d'Application

 


 

La galaxie XML

 


 

Traitement de XML

 


 

XML

 

XFormsXLink
XML SchemaXPointerXSLTXQueryRDF Schema
XPathRDFXHTMLSMILMathML
XML, DTD, Namespace

 

Formalismes XML

 


 

Document XML

 


 

DTD: Document Type Definition

 


 

DTD

 

Document XML :

<?xml version="1.0"?>

<!DOCTYPE bibliography SYSTEM "http://somewhere.net/book.dtd">

<bibliography>
<book>
	<author>
		<firstname>John Maynard</firstname>
		<lastname>Keynes</lastname>
	</author>
	<title>The General Theory of Employment, Interest and Money</title>
	<publisher>Macmillan</publisher>
</book>
</bibliography>

DTD :

<!ELEMENT bibliography (book*)>

<!ELEMENT book (author, title, publisher, year?)>

<!ELEMENT author (firstname, lastname)>

<!ELEMENT title (#PCDATA)>

<!ELEMENT publisher (#PCDATA)>


 

Element

 

<!ELEMENT text ((para|figure)+)>

<!ELEMENT nihil EMPTY>

   <nihil/>

<!ELEMENT cool ANY>


 

Attribute list

 

<!ATTLIST book id ID #REQUIRED>

        <book id="V0-98/04">...</book>



<!ELEMENT reference(#PCDATA)>

<!ATTLIST reference value IDREF #IMPLIED>

       <reference value="V0-98/04">
          Un livre passionnant ...
       </reference>

 

Attribute list (2)

 

<!ATTLIST title
       form (bold|italic|normal) "normal" #IMPLIED>

        <title form="italic">A Theory of Justice</title>


<!ATTLIST author name CDATA #REQUIRED>

       <author name="Jean-Sol Partre"/>

 

Entity

 

<!ENTITY cpr "Copyright INRIA 1998">


<text>du texte libre ... &cpr; </text>


<text>du texte libre ... Copyright INRIA 1998 </text>

 

Entity externe

 

Pour intégrer un document XML dans un autre :

<!DOCTYPE test [

   <!ENTITY include SYSTEM "file.xml">
]>

<test>

   &include;

</test>

 

Entity de DTD

 

Définir les deux attributs name et id :

<!ENTITY % attr-list "name CDATA #IMPLIED id IDREF #REQUIRED">

Utiliser cette définition dans l'élément Test :

<!ELEMENT Test (#PCDATA)>

<!ATTLIST Test %attr-list; >

Equivaut à :

<!ATTLIST Test name CDATA #IMPLIED id IDREF #REQUIRED>

 

Unparsed entity

 

<!ENTITY icon SYSTEM "../icons/test.gif" NDATA gif>


<!ELEMENT figure EMPTY>
<!ATTLIST figure image ENTITY #REQUIRED>

 
<figure image="icon"/>

 

Notation

 

<!NOTATION gif SYSTEM "gifprocessor">

 

Processing instruction

 

Directive de traitement au processeur XML : navigateur, parser, etc.

<?xml-stylesheet type='text/xsl' href='talk.xsl'?>

 

Autres

 

<!-- comment -->
<![CDATA[
       ici du texte avec des balises est reconnu comme du texte, 
       exemple: ici <a> n'est pas une balise
]]>

 

Namespace

 


 

Exemple namespace

 

<s:book 
	xmlns:s='http://www.inria.fr/acacia/corby'

	xmlns:html='http://www.w3.org/TR/REC-html40'>

    <s:title>XML</s:title>

    <s:author>O. Corby</s:author>

    <html:p> ...</html:p>

</s:book> 

 

Structure du document

 

Il y a 7 types de noeud dans un arbre XML

Le parser XML intègre au document


 

Eléments de méthodologie

 

Eviter :

<name> [Olivier] [Corby] </name>

Préférer :

<firstname>Olivier</firstname> 

<lastname>Corby</lastname>

 

Elément vs attribut ?

 

Préférer les éléments, plutôt que les attributs, pour exprimer le contenu du document

A ceci :

<book   author="J. M. Keynes" 

	title="The General Theory of Employment, Interest and Money"/>

Préférer ceci :

<book>
	<author>J. M. Keynes</author>

	<title>The General Theory of Employment, Interest and Money</title>
</book>

 

Elément vs attribut ?

 

Utiliser les attributs pour :

Exprimer des relations entre éléments (e.g. référence, lien hypertexte)

<author id="oc"> 
	<firstname>Olivier</firstname>
	<lastname>Corby</lastname>
</author>

<paper ref="oc"/>

Exprimer des données codées

<country code="fr">France</country>

Compléter une valeur d'élément avec une unité, etc.

<length unit='m'>2.718</length>

<amount currency='euro'>3.14</amount>

 

Elément vs attribut ?

 


 

XML Schema

 

Recommandation du W3C : Mai 2001

Un langage pour définir la structure et le typage des documents

Une syntaxe XML


 

Recommandation

 


 

Type complexe

 

Déclaration d'un élément book :


<xsd:schema xmls:xsd="http://www.w3.org/2001/XMLSchema"
	xmls:s='http://www.inria.fr/acacia'>

	<xsd:element name="book" type="s:bookType"/>

<!-- Déclaration de son type bookType-->


	<xsd:complexType name='bookType'>
    		<xsd:sequence>
			<xsd:element name='author' 	type='s:author'/>
			<xsd:element name='title'	type='string'/>
			<xsd:element name='publisher' 	type='string'/>
			<xsd:element name='year' 	type='integer'/> 
    		</xsd:sequence>

    		<xsd:attribute name='id'		type='string'/>
	</xsd:complexType>
<xsd:schema>

Elément book dans un document


<s:book id='...'>
	<s:author>
		<s:name>J. M. Keynes</s:name>
	</s:author>
	<s:title>General Theory ...</s:title>
	<s:publisher>...</s:publisher>
	<s:year>...</s:year> 
<s:book>


 

Type complexe avec choix

 


<xsd:complexType name='bookType'>
    <xsd:sequence>
	<xsd:element name='author' 	type='s:author'/>
	<xsd:element name='title'	type='string'/>
	<xsd:element name='publisher' 	type='string'/>

	<xsd:choice>
		<xsd:element name='year' 	type='gYear'/>
		<xsd:element name='date' 	type='date'/> 
	</xsd:choice>

    </xsd:sequence>

    <xsd:attribute name='id'		type='string'/>
</xsd:complexType>	

 

Déclaration sans ordre

 

Tous les éléments doivent apparaitre zéro ou une fois, dans n'importe quel ordre


<xsd:complexType name="bookType">
   <xsd:all>
	<xsd:element name='author' 	type='s:author'/>
	<xsd:element name='title'	type='string'/>
	<xsd:element name='publisher' 	type='string'/>
	<xsd:element name='year' 	type='gYear'/> 
   </xsd:all>
   <xsd:attribute name='id'		type='string'/>
 </xsd:complexType>

 

Facettes d'occurrence

 

Pour un élément


<xsd:element name="date" type="integer"
	minOccurs="0" maxOccurs="1" 
	fixed="2000" default="2000"/>

Pour un attribut


<xsd:attribute name="price" type="integer"
	use="required | optional | fixed | default"
	value="123"/>

 

Types simples

 

  • string
  • integer
  • decimal
  • float
  • boolean
  • time : 13:20:00.000
  • timeInstant : 1999-05-31T13:20:00.000-05:00
  • date
  • Name
  • QName
  • ID IDREF
  • NMTOKEN
  • ENTITY
  • ...

 

Type simple étendu

 

Spécification d'un motif à l'aide d'expression régulière

Date sous la forme : 16-10-1959


<xsd:simpleType name="Date">
   <xsd:restriction base="xsd:string">
	<xsd:pattern value="\d{2}-\d{2}-\d{4}"/>
   </xsd:restriction>
</xsd:simpleType>

Code sous la forme : Catch-22


<xsd:simpleType name="code">
   <xsd:restriction base="xsd:string">
	<xsd:pattern value="[A-Za-z]{5}-\d{2}"/>
   </xsd:restriction>
</xsd:simpleType>

 

Type énuméré

 


<xsd:simpleType name="Region">
   <xsd:restriction base="xsd:string">
     <xsd:enumeration value="Alsace"/>
     <xsd:enumeration value="Centre"/>
     <xsd:enumeration value="Languedoc-Roussillon"/>
     <xsd:enumeration value="PACA"/>
     <!-- etc ... -->
   </xsd:restriction>
</xsd:simpleType>

 

Type liste

 


<xsd:simpleType name="ListeRegion">
  <xsd:list itemType="Region"/>
</xsd:simpleType>

<xsd:element name="regions" type="ListeRegion"/>

Elément de type liste de régions :


<regions>Alsace PACA</regions>

 

Type simple avec attribut

 

Déclaration d'un élément de type simple avec attribut


 <xsd:element name="price">
   <xsd:complexType>
    <xsd:simpleContent>
     <xsd:extension base="xsd:decimal">
      <xsd:attribute name="currency" type="xsd:string" />
     </xsd:extension>
    </xsd:simpleContent>
   </xsd:complexType>
 </xsd:element>

Elément


<price currency="EUR">423.46</>

 

Type dérivé par extension

 

Un type peut être dérivé d'un autre par extension

Ici on ajoute un élément URI à un type bookType


<xsd:complexType name='eBookType'>
    <xsd:complexContent>
	<xsd:extension base='bookType'>
		<xsd:sequence>
			<xsd:element name='URI' type='uriReference'/>
		</xsd:sequence>
	</xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

 

Utiliser un type dérivé dans un document

 

Déclaration d'un élément item de type bookType


<xsd:element name="item" type="bookType"/>

Elément item standard (i.e. de type bookType):


<s:item>
	<s:author> ...</s:author>
	...
	<s:date>..</s:date>
</s:item>

Elément item de type eBookType :


<s:item xsi:type="eBookType">
	<s:author> ...</s:author>
	...
	<s:date>..</s:date>
	<s:URI> ...</s:URI>
</s:item>

Si l'on utilise un type dérivé dans le document, à la place du type de base, il faut le signaler.


 

Contrainte d'intégrité : unicité

 

La valeur de l'attribut code des éléments regions/zip est unique


<xsd:unique name="dummy1">
       <xsd:selector xpath='regions/zip'/>
       <xsd:field xpath='@code'/>
</xsd:unique>

 

Contrainte d'intégrité : clé et référence

 

Toute clé référencée doit être définie. Exemple : référence bibliographique


<para>....<bibref code="Corby1999"/> ...</para>

<bibliography>
	<bibitem code="Corby1999">
		<author>Olivier Corby</author>
		...
	</bibitem>
</biliograpgy>

Définition de la clé bibitem/@code et de la référence bibref/@code


<xsd:key name="bib">
	<xsd:selector xpath='bibitem'/>
	<xsd:field xpath='@code'/>
</xsd:key>

<xsd:keyref name="dummy" refer="bib">
	<xsd:selector xpath='bibref'/>
	<xsd:field xpath='@code'/>
</xsd:keyref>

 

Autres

 

Equivalence entre éléments :


<xsd:element name="comment" 	type="string" />

<xsd:element name="shipComment" type="string" 
		substitutionGroup="ipo:comment" />

<xsd:element name="customerComment" type="string" 
		substitutionGroup="ipo:comment" />

Groupe d'éléments


<xsd:group name="shipAndBill">
	<xsd:sequence>
                <xsd:element name="shipTo" type="USAddress" />
                <xsd:element name="billTo" type="USAddress" />
        </xsd:sequence>
</xsd:group>

<xsd:group   ref="shipAndBill" />

Groupe d'attributs


<xsd:attributeGroup name="ItemDelivery">
              <xsd:attribute name="partNum" type="SKU"/>
              <xsd:attribute name="weightKg"  type="xsd:decimal"/>
</xsd:attributeGroup>

<xsd:attributeGroup ref="ItemDelivery"/>

 

Autres

 

Union type


<xsd:simpleType name="zipUnion">
     <xsd:union memberTypes="USState listOfMyIntType"/>
</xsd:simpleType>

Union of different kinds of types :


<xsd:simpleType>
    <xsd:union>
	<xsd:simpleType>
             <xsd:restriction base='nonNegativeInteger'/>
        </xsd:simpleType>
        <xsd:simpleType>
             <xsd:restriction base='string'>
                  <xsd:enumeration value='unbounded'/>
             </xsd:restriction>
        </xsd:simpleType>
    </xsd:union>
</xsd:simpleType>

 

Autres

 

Mixed content :


<xsd:element name="letterBody">
      <xsd:complexType mixed="true">
	  <xsd:element .../>
      </xsd:complexType>
</xsd:element>

Any type :


<xsd:element name='anything' type='xsd:anyType'>
<xsd:element name='anything'/>

Empty content type:


<xsd:element name='vacuum'>
	<xsd:complexType>
		<xsd:attribute .../>
	</xsd:complexType>
</xsd:element>

null content :

<xsd:element name="shipDate" type="xsd:date" nillable="true"/> 

<shipDate xsi:nil="true"></shipDate> 

 

Autres

 

Abstract : ne peut être utilisé dans un document :

<xsd:element name="comment" type="string" abstract="true"/>

<xsd:complexType name="Vehicle" abstract="true"/> 

Limiter la dérivation de types :

<xsd:complexType name="Address" final="restriction|extension|#all">

Limiter l'utilisation d'un type dérivé à la place d'un type de base dans un document :

<xsd:complexType name="Address" block='restriction|extension|#all'>

 

Autres

 

targetNamespace


<schema xmlns="http://www.w3.org/2001/XMLSchema"
      targetNamespace='http://www.inria.fr/acacia'>
...
</schema>

Référence au schema dans un document


<s:document xmls:xsi='http://www.w3.org/2001/XMLSchema-instance' 
	xsi:schemaLocation='http://www.inria.fr/acacia 
			    http://www.inria.fr/acacia/pub/schema.xsd'
	xmls:s='http://www.inria.fr/acacia'>

....

</s:document>

documentation


<xsd:annotation>
    <xsd:documentation>XML Schema is not de la tarte</xsd:documentation>
</xsd:annotation>

 

Autres

 


<xsd:any namespace='a namespace | ##targetNamespace | 
			##any | ##local | ##other' 
	processContents='skip | lax | strict'/>

<xsd:anyAttribute namespace='...'/>

length, minLength, maxLength

totalDigits
fractionDigits

prohibited

<xsd:include schemaLocation='http://...' />

<xsd:redefine schemaLocation='http://...'/>

elementFormDefault='qualified' for local elements only
attributeFormDefault='qualified' for local attributes only
form='qualified'
blockDefault='#all'


global definition and ref=''

multiple local definitions of element with same name and different types


 

Outils

 

Browser XML


 

Outils

 


 

Outils (2)

 


 

Processeur XML

 


 

DOM : Document Object Model

 


 

DOM

 

Interfaces pour :


 

Node

 

Interface racine des interfaces DOM

interface Node {ATTRIBUTE_NODE 

 	COMMENT_NODE

 	DOCUMENT_NODE

 	DOCUMENT_TYPE_NODE

 	ELEMENT_NODE

 	ENTITY_NODE

 	NOTATION_NODE

 	PROCESSING_INSTRUCTION_NODE

 	TEXT_NODE 

}

 

Node

 

interface Node {

	NodeList getChildNodes();

	NamedNodeMap getAttributes();
 
	String getNodeName();

	String getNodeValue();

	short getNodeType();
}

 

Document

 

Modélise le document XML

interface Document : Node {

	Element createElement(in DOMString tagName) 
		raises(DOMException);

	NodeList getElementsByTagName(in DOMString tagname);
}

 

Element

 

Les noeuds de l'arbre de type élément (balise)

interface Element : Node {

	DOMString getAttribute(in DOMString name);

	void setAttribute(in DOMString name, in DOMString value)
	raises(DOMException);

}

Hérite getChildNodes() et getAttributes() de l'interface Node


 

Attribute

 

interface Attr : Node {

	String getName();
	String getValue();

}

 

DOM : Java API

 

Parser un document XML en Java

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

public class DOMParser {

    public static void main (String args[]) throws Exception  {

    	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

    	DocumentBuilder parser=factory.newDocumentBuilder();

    	Document doc=parser.parse(args[0]);

    }
 
}

 

DOM : Exemple de parcours d'arbre

 

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

public class DOMParser {

    public static void main (String args[]) throws Exception  {
    	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    	DocumentBuilder parser=factory.newDocumentBuilder();
    	Document doc=parser.parse(args[0]);

	Node root=doc.getDocumentElement();

    	new DOMParser().walk(root);
    }

Parcours récursif d'un arbre XML DOM

void walk(Node root){
	Node node;
	System.out.println(root.getNodeName() + " " + root.getNodeValue());
	NodeList list=root.getChildNodes();
	for (int i=0; i<list.getLength(); i++){
	    node=list.item(i);
	    walk(node);
	}
     }
}

 

SAX : Simple API for XML

 

Interface de programmation définie par la communauté XML, supportée par les parsers XML

Traitement dirigé par les événements (event driven)

Réalisé sous forme de callbacks appelées par le parser, traitées par un Handler

L'utilisateur crée son propre handler qui réalise les traitements appropriés :

startDocument                    

endDocument

startElement

endElement

characters

processingInstruction


 

SAX : Simple API for XML

 

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class SaxParse {

public static void main (String args[]) throws Exception {

    SAXParserFactory factory=SAXParserFactory.newInstance();

    SAXParser parser=factory.newSAXParser();

    DefaultHandler handler = new MyHandler();

    try {
       parser.parse(args[0], handler);    
    }
    catch (SAXException e){
        System.out.println(e.getMessage());
    }
}
    
}

 

SAX : Handler

 

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler extends DefaultHandler {

    public void startDocument (){

    }
 
    public void startElement(String namespaceURI, String simpleName, 
			     String qualifiedName, Attributes atts){
        atts.getValue("name");

	for(int i=0; i<atts.getLength(); i++){
	    atts.getValue(i);
	}
    }
    
    public void characters (char buf [], int offset, int len){
	String s=new String(buf, offset, len);

    }

    public void endElement (String namespaceURI, String simpleName, 
			    String qualifiedName){ 
    }


    public void endDocument (){
	
    }
}

 

Web sémantique

 

The Semantic Web is an extension of the current web in which information is given well-defined meaning, better enabling computers and people to work in cooperation. Tim Berners-Lee


 

Données et informations

 


 

RDF : Resource Description Framework

 


 

Web Service

 

The World Wide Web is more and more used for application to application communication. The programmatic interfaces made available are referred to as Web services.


 

SOAP

 


 

WSDL

 


 

X Files : Sites de référence