Lire et manipuler du XML... Les programmes qui manipulent du XML doivent être capables de lire du XML de le représenter en mémoire Pour lire, il existe une API événementielle Simple API for XML – SAX Pour représenter du XML sous forme d'arbre Document Object Model – DOM (utilisé partout et surtout pour HTML)
Manipuler du XML en Java La librairie JAXP Permet de lire et représenter du XML Parsers (SAX ET DOM) javax.xml.parsers APIs SAX, DOM et StAX (mélange des 2 premiers) org.w3c.dom org.xml.sax javax.xml.stream (StAX) Permet de transformer du XML API XSLT La librairie JAXB Mapping objet-XML
Document Object Model C'est une interface standardisée permettant à des programmes d'accéder et de modifier le contenu de documents représentés sous forme d'arbres XML mais aussi HTML Recommandation W3C Il existe différentes versions de DOM Level 1 : Représentation des doc sous forme d'arbre (une balise → un nœud), opérations d'ajout, et de modification et de suppression Level 2 : Evènements, Ajout de l'accès par clé → getElementById Levels 3 et 4 : Support de Xpath, événements clavier, serialization XML
Simple API for XML SAX traite un document XML comme un flux d'événements Il ne permet pas l'accès aléatoire/direct à une portion du document On n'a pas besoin de charger tout le document en mémoire Les avantages Rapide, faible besoin en mémoire Les désavantages C'est moins facile que DOM...
Comparaison SAX et DOM SAX utilise une représentation sous forme d'événements et DOM sous forme d'arbre Source: https://docs.oracle.com/cd/B28359_01/appdev.111/b28394/adx_j_parser.htm#CCHCCEHA
Aperçu de SAX en Java On obtient un parser SAX via la SAXParserFactory Le doc. XML est parsé et les méthodes d'un ou plusieurs Handler sont appelées en réaction aux parties du document traité
Utilisation Illustration de la notion d'événements : https://en.wikipedia.org/wiki/Simple_API_for_XML# XML_processing_with_SAX#Example Tutorial SAX : https://docs.oracle.com/javase/tutorial/jaxp/sax/ind ex.html
Les types DOM DOM est composé d'un ensemble d'objets, chacun pourvu de méthodes Document Représente le document en entier, et sert de point d'entrée dans l'arbre Node Représente tout type de nœud (élément, texte attribut, etc.) Document est un sous-type de node
L'interface Document Les méthodes de recherche getElementById(x) L'élement doit avoir un attribut id getElementsByTagName(x) Retourne la liste des nœuds de type élements qui ont le nom passé en paramètre Les méthodes de création Element createElement(DOMString) Pour créer un élément, il faut ensuite l'insérer au bon endroit → c.f. méthodes de Node Text createTextNode(DOMString) Pour créer un nœud de type text
L'interface d'un Node Les attributs de base d'un nœud DOM nodeType : type du nœud 1=ELEMENT_NODE, 2=ATTRIBUTE_NODE,3=TEXT_NODE, 4=CDATA_SECTION_NODE, 5=ENTITY_REFERENCE_NODE, 6=ENTITY_NODE, 7=PROCESSING_INSTRUCTION_NODE, 8=COMMENT_NODE, 9=DOCUMENT_NODE, 10=DOCUMENT_TYPE_NODE, 11=DOCUMENT_FRAGMENT_NODE, 12=NOTATION_NODE nodeName : le nom du nœud Nom de la balise, de l'attribut ou #text si le nœud est de type 3 Pour les autres voir : http://www.w3schools.com/xml/dom_nodetype. asp nodeValue : la valeur du nœud Non null seulement pour les nœud feuilles attributes : liste des attributs du noeud textContent (DOM3) : représentation textuelle du nœud et de ses descendants
Résumé Interface nodeName nodeValue attributes Attr name of attribute value of attribute null CDATASection "#cdata-section" content of the CDATA Section Comment "#comment" content of the comment Document "#document" DocumentFragment "#document-fragment" DocumentType document type name Element tag name NamedNodeMap Entity entity name EntityReference name of entity referenced Notation notation name ProcessingInstruction target entire content excluding the target Text "#text" content of the text node
L'interface d'un Node (suite) Attributs de navigation ParentNode, childNodes, firstChild, lastChild, previousSlibing, nextSlibing Attributs d'espace de noms (namespace) namespaceURI, prefix, localName, baseURI Quelques méthodes Node appendChild(Node ajouté) Node insertBefore(Node inséré, Node ici) Node removeChild(Node supprimé) Node replaceChild(Node nouveau, Node ancien) Node cloneNode(Boolean) Boolean hasAttributes() Boolean hasChildNodes() Plus d'infos : https://developer.mozilla.org/en- US/docs/Web/API/Node
Aperçu de DOM en Java On récupère une instance de DocumentBuider (parser) via la DocumentBuilderFactory. La lecture d'un document XML via le DocumentBuilder retourne un objet Document Tutorial : https://docs.oracle.com/javase/tutorial/jaxp/dom/readingXML.html
Streaming API for XML StAx est une API pour lire et écrire du XML selon le principe de pull-parsing Push-Parsing le parser envoie les événements vers le client le processus est conduit par le parser Pull-Parsing le client demande les données au parser Le processus est conduit par le client Le pull parsing est plus simple à utiliser On peut traiter du XML avec un itérateur comme pour une collection
StAX API 2 manières de parcourir des données XML Cursor Le document est vu comme une « table de données » Le curseur avance (seulement en avant) dans le document XML A chaque étape on récupère les données de l'endroit ou on est Itérateur Le document XML est vu comme un flux d'évènements Les évènements sont des objets du type XMLEvent On itère sur ce flux d'évènements