tite fractale

Introduction à XML

1. Définitions

1.1. En résumé

XML signifie littéralement « langage de balisage extensible ». Il dérive du SGML. Son extensibilité a permis à beaucoup de langages d’en dériver (voir les exemples ci-dessous).

Ce langage de description n’est pas considéré comme un langage de programmation, mais il est possible de créer des langages Turing-complets basés sur XML (comme par exemple XSLT, décrit plus loin).

Cette extensibilité est contrôlée par des déclarations qui permettent de valider ou non un document par rapport à un schéma ou une définition de type de document. Ainsi, des systèmes informatiques tout à fait différents peuvent s’échanger des données structurées, en utilisant finalement le même langage.

Quelques articles Wikipedia :

1.2. Syntaxe

Un fichier XML est reconnaissable à l’utilisation des chevrons < et > (comme le HTML, il dérive du SGML) pour constituer des balises qui vont s’emboîter et/ou contenir du texte. Ce sont elles qui donnent à un document XML sa structure d’arbre (notion importante, voir ces schémas).

On note de plus :

Voir la section correspondante sur l’article Wikipedia, ainsi que la recommendation du W3C.

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="modelVisiteurs.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
        <EntityContainer Name="modelVisiteursStoreContainer">
          <EntitySet Name="Departement" EntityType="modelVisiteurs.Store.Departement" store:Type="Tables" Schema="dbo" />
          <EntitySet Name="Region" EntityType="modelVisiteurs.Store.Region" store:Type="Tables" Schema="dbo" />
          <EntitySet Name="Travailler" EntityType="modelVisiteurs.Store.Travailler" store:Type="Tables" Schema="dbo" />
          <EntitySet Name="Visiteur" EntityType="modelVisiteurs.Store.Visiteur" store:Type="Tables" Schema="dbo" />
          <AssociationSet Name="FK_DEPARTEMENT" Association="modelVisiteurs.Store.FK_DEPARTEMENT">
            <End Role="Departement" EntitySet="Departement" />
            <End Role="Visiteur" EntitySet="Visiteur" />
          </AssociationSet>
...
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
    <Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </Connection>
    <Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
        <DesignerProperty Name="EnablePluralization" Value="False" />
        <DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
      </DesignerInfoPropertySet>
    </Options>
    <!-- Diagram content (shape and connector positions) -->
    <Diagrams>
      <Diagram Name="modelVisiteurs">
        <EntityTypeShape EntityType="modelVisiteurs.Departement" Width="1.5" PointX="0.5" PointY="1.5" Height="1.4279589843749996" IsExpanded="true" />
        <EntityTypeShape EntityType="modelVisiteurs.Region" Width="1.5" PointX="5.125" PointY="1.625" Height="1.4279589843749996" IsExpanded="true" />
        <EntityTypeShape EntityType="modelVisiteurs.Visiteur" Width="2" PointX="2.625" PointY="0.5" Height="2.5783902994791656" IsExpanded="true" />
        <AssociationConnector Association="modelVisiteurs.FK_DEPARTEMENT" ManuallyRouted="false">
          <ConnectorPoint PointX="2" PointY="2.2139794921875" />
          <ConnectorPoint PointX="2.625" PointY="2.2139794921875" />
        </AssociationConnector>
        <AssociationConnector Association="modelVisiteurs.Travailler" ManuallyRouted="false">
          <ConnectorPoint PointX="5.125" PointY="2.3389794921875" />
          <ConnectorPoint PointX="4.625" PointY="2.3389794921875" />
        </AssociationConnector>
      </Diagram>
    </Diagrams>
  </Designer>
</edmx:Edmx>

2. Exemples dans la nature

Voir la section correspondante sur l’article Wikipedia.

3. Manipulation

Les outils à disposition sont nombreux. Très. Nous n’en détaillons ici que quelques uns. Voir la section correspondante sur l’article Wikipedia.

3.1. Humaine

Il nous est possible d’écrire et de lire du XML, mais les frais en aspirine deviennent considérables. Mettre des données dans du XML revient à dire : « à partir de maintenant, c’est l’ordinateur qui s’occupe de ça ». Ou alors c’est du sadisme (malheureusement répandu).

Si un humain est contraint à la manipulation de XML, autant le faire dans de bonnes conditions, c’est-à-dire avec un éditeur décent. Certains éditeurs comme Notepad++ ont par exemple un plugin XML.

3.2. XPath

3.2.1. Définition

XPath est un des langages qui permet de « parcourir » un document XML pour y localiser une information de façon très fine. La structure d’arbre d’un document XML nous a poussé à utiliser le vocabulaire de la généalogie.

3.2.2. Exemples Wikipedia

Plutôt que de lire la spécification XPath, le mieux est de parcourir les exemples de la page Wikipedia :

<?xml version="1.0"?>
<racine>
    <encyclopedie nom="Wikipedia" site="http://fr.wikipedia.org/">
        <article nom="XPath">   
            <auteurs>
                <auteur>
                    <nom>Dupont</nom>
                </auteur>
                <auteur>
                    <nom>Dubois</nom>
                </auteur>
            </auteurs>
        </article>
    </encyclopedie>
</racine>
Expression XPath Résultat
/ sélectionne un nœud "fictif", dit root element, qui englobe tout le document sauf <?xml version="1.0"?>
/root sélectionne le nœud vide, puisqu'il n'y a pas d'élément "root" (mais "racine")
//article sélectionne tous les éléments "article" du document où qu'ils soient
/racine/encyclopedie sélectionne l'unique élément "encyclopedie" puisqu'il est ici le seul fils de "racine" portant ce nom
//article[@nom='XPath'] sélectionne tous les éléments "article" du document où qu'ils soient, ayant un attribut "nom" dont la valeur est "XPath"

Toutes ces expressions XPath sont absolues (elles commencent par un caractère "/"), c'est-à-dire qu'elles donnent le même résultat quel que soit le contexte. Les expressions suivantes sont relatives. Si le contexte courant est l'unique élément "encyclopedie", elles donnent :

Expression XPath Résultat
article sélectionne l'élément "article"
racine ne sélectionne rien, vu le contexte
article[1]/auteurs/auteur[2] sélectionne le second auteur (Dubois) du premier article
article[ count( article/auteurs/auteur) >1 ] sélectionne les articles qui ont au moins 2 auteurs
../racine sélectionne l'élément "racine", puisqu'il est parent de l'élément courant

Le résultat de ces sélections dépendra de la nature de la tâche :

3.3. Javascript

3.3.1. Le DOM

Voir ce cours ou ces exemples.

3.3.2. Avec XPath

À partir du squelette XPath, tester les exemples de la page Wikipedia. Vous aurez besoin de documentation :

3.4. Python

En cours de rédaction…

3.5. PHP

Voir ce squelette, qui permettra de parcourir ce fichier XML. Le but est de le compléter afin qu’il affiche ceci.

3.6. XSLT

XSLT est une ancienne figure de proue des langages fonctionnels. Il est lui-même une extension d’XML. On attache une feuille XSLT à un document XML avec la déclaration :

<?xml-stylesheet href="feuille.xsl" type="text/xsl" ?>

À partir des squelettes :

tester les exemples de la page Wikipedia. Attention, certaines restrictions font que certains navigateurs empêchent l’exécution des feuilles de styles sous certaines conditions. Soyez certaines d’avoir regardé les messages d’erreur et d’avoir essayé plusieurs navigateurs avant d’abandonner.

Quelques liens :

3.7. CSS

Bien connu dans le cadre du web et du HTML, une feuille CSS peut être attachée à un document XML avec la déclaration :

<?xml-stylesheet href="feuille.css" type="text/css" ?>

Les possibilités sont moins nombreuses, mais tout de même intéressantes. Voir l’article Wikipedia.




Christophe Gragnic, le 18/12/2014, 23h06'44".






Page générée le 04/12/2016, 10h08'07" (source).
historique de la page
historique global

 TogetherJS