xmltool

Guillaume ABADIE,  Thierry CANTENOT,  Juliette COURLET,

Rémy DOMINGUEZ,  Adrien DUFFY,  Ahmed KACHKACH

Architecture XML


Parser XML


 -Parse : 

     Doctype,  CData, PI, Commentaire, Balise, Attributs


- Implémentation minimaliste de XPath


- Gestion des erreurs :
        - Parser souple
        - Classe Log

Algorithme XSD


3 tables de hachage

  • Association <nom Type / objet Type>

  • Association <nom Element / nom Type>
  • Association <nom Attribut / nom Type>


  • Construction de l'arbre XSD
    • Parcours récursif de l'arbre XML issu du document XSD
    • Une passe
    • Gestion des références
  • Validation d'un document XML



Algorithme XSD


  • Choix d'éléments racine multiples
  • Présence et type des attributs
  • Éléments de types mixed
  • Éléments sequence et choice imbriqués
  • Nombre d'occurences minimum et maximum par élément
  • Références sur des attributs, éléments et types

XML :


XSD :

Algorithme XSL

Parcours récursif des éléments du document XML à transformer, avec application des templates qui matchent.

Au niveau des templates : application des instructions XSL (for-each, apply-templates, value-of)
 
On switch constamment entre XML et XSL !

Concept clé : le contexte d'application des templates.

XML :

<catalog>  <cd>    <title>Dapt Funk</title>  </cd>  <cd>
    .....
  </cd>
</catalog>
XSL :
<xsl:stylesheet>  <xsl:template match="catalog">
    <ul>
      <xsl:for-each select="cd">
        <li><xsl:value-of select="title"/></li>
      </xsl:for-each>
    </ul>
  </xsl:template></xsl:stylesheet>

Environement de tests

  • Assertions dynamique
    • Vérifications des contrats
    • Vérifications {pre,post} conditions
    • Trigger des breakpoints dans gdb
  • Tests compilés
    • Exécutables distincts
    • Assertions de test
  • Tests d'intégrations

Assertions dynamiques

Element::ElementList
Element::elements() const
{
ElementList elements;
for(auto const & c : mChildren)
{
app_assert(c != nullptr);
app_assert(c->mParent == this);

if(c->isElement())
{
elements.push_back(static_cast<Element const *>(c));
}
}
return elements;
}

Tests compilés

std::string content(xml_code(
<hello>
<balise1>
</balise3>
<balise2>
</balise2>
</hello>
));

Xml::Log log;
Xml::Document * doc = Xml::parse(content, &log);

test_assert(doc != 0);
test_assert(doc->root()->elements("balise1").size() == 1);
test_assert(doc->root()->elements("balise2").size() == 1);
delete doc;




Démo

Rôles

  • Guillaume ABADIE (Chef de projet)
    • Développeur, Responsable compilation/tests
  • Thierry CANTENOT
    • Développeur, Responsable qualité code
  • Juliette COULERT
    • Développeuse
  • Rémi DOMINGUES
    • Dévelopeur, Responsable LaTeX
  • Adrien DUFFY
    • Développeur, Responsable documentation code
  • Ahmed KACHKACH
    • Développeur

Origanisation

  • Groupe XML (Thierry, Guillaume)
    • Conception, Implémentation, Tests
  • Parser XML
  • Groupe XSD (Juliette, Rémi)
    • Conception, Implémentation, Tests
  • Groupe XSL (Adrien, Ahmed)
    • Conception, Implémentation, Tests
  • Rapport LaTeX

Technologies utilisées

  • C++ 2011
    • Fonctionnalitées de GCC 4.7
  • Bison, Flex
  • RE2:
    • Librairie C++ de regex
    • Utilisée par Google et Facebook
  • Framework Candy Makefile
    • Compilation / tests
  • LaTeX

Retour d'experience

  • Les +
    • Mise en application du BISON
    • Peu de paperasse
    • Opportunité de faire autre chose que du cycle en V à 6
  • Les -
    • Le BISON représente un volume de code trop petit
    • Perte de temps à respecter les standards XML ambigus




Questions ?

XmlTool

By hexamome

XmlTool

  • 641