Parseurs XML dotnet version
Transcription
Parseurs XML dotnet version
XML Parseurs DotNet XmlReader et XmlWriter XmlDocument Parseurs XML Espace de noms: System.XML System XML XmlReader et XmlWriter (classes abstraites) Parseurs XML en avant uniquement. uniquement XmlReader Vérifie que le document et la DTD sont bien formés mais ne vérifie pas que le document est valide formés, XmlDocument 2 http://www.itformation.com XmlReader et XmlWriter Espace de noms System.XML System XML Les classes abstraites XmlReader et XmlWriter fournissent les méthodes de base pour parser des documents XML 3 http://www.itformation.com XmlReader La classe p possède un curseur qqui définit le nœud courant dans le document XML (au moment de la création d'une instance de la classe XmlReader ce curseur est positionné au début du document, l'appel de la méthode Read() permet de le positionné sur le premier nœud du document.). La méthode é h d Read() d positionne lle curseur sur lle nœudd suivant et retourne true, s'il n'existe plus de nœuds à parcourir elle retourne false Création d'un flux XmlReader Create: C crée é une instance de d type XmlReader l d (12 surcharges) h ) Create XmlReader xr; // créer un XmlReader qui lit à partir d'un flux de type Stream System.IO.Stream s; xr = XmlReader.Create(s); // Créer un XmlReader qui lit à partir d'un fichier xr = XmlReader.Create(@"C:\exemple1.xml"); 4 http://www.itformation.com Propriétés AttributeCount: nombre dd'attributs attributs du nœud en cours EOF: vaut true si la fin du flux est atteinte. HasAttributes: vaut true si le nœud en cours possède des attributs HasValue: vaut true si le nœud en cours possède une valeur NodeType: type du nœud (une valeur de type XmlNodeType) Name: nom du nœud. V l valeur Value: l ddu nœudd Lecture d'un document xml bool Read():lit le nœud suivant dans le flux et retourne true si l'opération s'est déroulée avec succès è Read() while hil (xr.Read()) ( R d()) {//Afficher la valeur de la proriété Name des noeuds de type Element if (xr.NodeType == XmlNodeType.Element) (( + xr.Name)); )); Console.WriteLine(("Element:" //Afficher la valeur de la proriété Value des noeuds de type Text else if (xr.NodeType == XmlNodeType.Text) Console.WriteLine(("Text:" + xr.Value)); } 5 http://www.itformation.com enum XmlNodeType Nom de membre Description None si aucun nœud courant n'est défini Element Attribute Text Elément Attribut Texte d'un nœud. CDATA Section CDATA EntityReference Entity ProcessingInstruction Comment Document DocumentType DocumentFragment Notation Whitespace Référence à une entité (par exemple, &enti;). Déclaration d'entité (par exemple, <!ENTITY...>). Instruction de traitement (par exemple, <? … ?>). Commentaire Objet racine du document. Déclaration de type du document (par exemple, <!DOCTYPE...>). Fragment de document. Notation dans d lla dé déclaration l dde type ddu ddocument (<!NOTATION...>). Espace blanc entre le balisage. Espace blanc entre le balisage dans un modèle de contenu mixte ou espace blanc dans la portée SignificantWhitespace xml:space="preserve". EndElement Balise d'élément de fin (par exemple, </item>). 6 EndEntity Retourné lorsque XmlReader parvient à la fin du remplacement de l'entité, à la suite d'un appel à ResolveEntity. XmlDeclaration Déclaration XML (par exemple exemple, <?xml version= version='11.00'?>) ?>). http://www.itformation.com Name et Value Type de nœud Name Value Nom de l'attribut Type de nœud Attribute DocumentType Nom du document Attribute valeur El Element N de Nom d l'élé l'élément DocumentType Contenu EntityReference Nom de l'entité SignificantWhit eSpace Contenu ProcessingInstr uction Contenu , à l'exception de la cible ocess g st uct o Laa ccible be ProcessingInstruction XmlDeclaration Autres types 7 La chaîne littérale "xml" Chaîne vide http://www.itformation.com XmlDeclaration Contenu CDATA Contenu Comment Contenu WhiteSpace Contenu Text Contenu Autres types Chaîne vide Valeurs des attributs d'un élément GetAttribute(): retourne la valeur d'un d un attribut, attribut la méthode prend en argument le nom ou la position de l'attribut (base de l'index=0). MoveToFirstAttribute() MoveToNextAttribute() MoveToAttirbute():déplace le curseur du flux vers l'attribut dont le nom ou la pposition est spécifiée p f en argument g et retourne true si l'opération p s'est effectuée ff avec succés . MoveToElement(): déplace le curseur vers l'élément contentant l'attribut. MoveToAttribute string xml="<Planete Nom=\"Jupiter\" type=\"gazeuse\" Satellites=\"16\" anneaux=\"Oui\" ></Planete>"; MemoryStream ms=new MemoryStream(Encoding.ASCII.GetBytes(xml)); XmlReader xr; xr = XmlReader.Create(ms); xr Read(); xr.Read(); xr.MoveToAttribute("Satellites"); Console.WriteLine("Nombre de satellites:" + xr.Value); ms.Close(); xr.Close(); xr.Close 8 http://www.itformation.com ReadInnerXml() et ReadOuterXml() Les deux méthodes sont utilisées pour extraire des fragments d'un document XML, la méthode ReadInnerXml retourne le contenu du nœud courant à l'exception des balises ouvrante et fermante de l'élément lui-même. La méthode ReadOuterXml retourne le contenu du nœud en cours y compris les balises ouvrante et fermante. Exemple: string xml = "<e1 <e1 a1=\ a1=\"v1\" v1\ a2=\ a2=\"v2\"> v2\ > t1<e2 a3=\ a3=\"v3\"> v3\ > t2 </e2></e1>"; Si le flux xr est positionné sur l'élément e1 alors: () retourne: t1<e2 a3="v3"> t2 </e2> xr.ReadInnerXml() et xr.ReadOuterXml() retourne: "<e1 a1="v1" a2="v2"> t1<e2 a3="v3"> t2 </e2></e1>. Si le flux xr est positionné sur l'attribut a1 alors: xr ReadInnerXml() retourne: xr.ReadInnerXml() retourne v1 et xr.ReadOuterXml() retourne: a1="v1" MoveToContent: si le nœud courant n'est pas un nœud de contenu, alors elle déplace le curseur vers le prochain nœud de contenu.Types de nœuds de contenu:CDATA, Element,EndElement, EntityReference, EndEntity,Text (s'il contient au moins un caractère qui n'est pas un caractère d'espacement) Skip(): p() déplace p le curseur vers le noeud suivant du même niveau qque le noeud courant: soit <e1> <e2></e2 ><e3><e3>, si le noeud courant est e1 alors skip() déplace le curseur vers le noeud e3. 9 http://www.itformation.com Implémentations de la classe XmlReader XmlTextReader est une implémentation de la classe XmlReader XmlTextReader xr; Stream s; xr = new XmlTextReader(s); xr = new XmlTextReader(@"C:\Exemple.xml"); 10 http://www.itformation.com La classe XmlWriter Classe abstraite, la méthode Create permet de créer une implémentation de cette classe, la méthode supporte 10 surchages. X lW it XmlWriter xw; xw = XmlWriter.Create("doc.xml"); XmlWriterSettings Lors de la création d'un flux XmlWriter spécifier une instance de la classe XmlWriterSettings Propriétés Indent IndentChars: caractère d'indentation (par défaut deux espaces NewLineChars: caractère de saut de ligne NewLineOnAttributes XmlWriterSettings XmlWriter xw; XmlWriterSettings config = new XmlWriterSettings(); // Indenter les élémentents config.Indent = true; xw = XmlWriter.Create("doc.xml", X lW it C t ("d l" config); fi ) 11 http://www.itformation.com Ecriture dans le flux XmlWriter WriteStartDocument WriteComment WriteStartElement, WriteElementString, WriteEndElement, WriteFullEndElement WriteAttributeString xw = XmlWriter.Create("d:/doc.xml"); xw.WriteStartDocument(false); // optionnel <?xml version version="1.0" 1.0 encoding encoding="utf-8" utf 8 standalone="no"?> xw.WriteComment("Exemple de document xml créé par XmlWriter"); //<!—Exemple de document xml créé par XmlWriter--> xw.WriteStartElement("planetes");// <planetes> xw.WriteStartElement("planete");// <planete> xw.WriteElementString("nom", "Jupiter"); //<nom>Jupiter</nom> xw.WriteStartElement( satellite );//<satellite xw.WriteStartElement("satellite");//<satellite xw.WriteAttributeString("nombre", "16");// nombre="16" xw.WriteEndElement();// /> xw.WriteStartElement("anneaux");// <anneaux> xw.WriteFullEndElement(); // </anneaux> / xw.WriteEndElement(); // </planete> xw.WriteEndElement(); // </planetes> xw.Close(); 12 http://www.itformation.com Validation d'un document XML Validation par rapport à un schéma XML Etape 1: Créer un objet XmlReaderSettings XmlReaderSettings config = new XmlReaderSettings(); Etape 2: Définir le type de validation, Valeurs possibles : Schema, Auto, None, DTD config.ValidationType = ValidationType.Schema; Etape 3: Ajouter le schéma à la collection des schémas config.Schemas.Add("espace_cible", "exemple1.xsd"); Etape 4: définir une méthode de rappel à appeler si une erreur de validation est détectée dans le document XML config.ValidationEventHandler += validation; Etape 5: créer un XmlReader à l'aide de la méthode Create qui prend en deuxième paramètre l'objet XmlReaderSettings XmlReader xr = XmlReader.Create("exemple1.xml", config); Etape 6: Parcourir le document xml while (xr.Read()) ; xr.Close(); Console.WriteLine("Le document XML est valide"); Etape 7: définir le gestionnaire de validation void validation(object sender,ValidationEventArgs e) {Console.WriteLine(e.Exception);} 13 http://www.itformation.com Validation par rapport à une DTD. Etape p 1: Créer un objet j XmlReaderSettings g XmlReaderSettings config = new XmlReaderSettings(); Etape 2: Définir le type de validation config.ValidationType g yp = ValidationType.DTD; yp Etape 3: Autoriser l'utilisation des DTD config.ProhibitDtd = false; Etape 4: définir une méthode de rappel à appeler si une erreur de validation est détectée dans le document XML config.ValidationEventHandler += validation; Etape 5: créer un XmlReader à l'aide de la méthode Create qui prend en deuxième paramètre l'objet XmlReaderSettings g XmlReader xr = XmlReader.Create("exemple1.xml", config); Etape 6: Parcourir le document xml (xr.Read()) ()) ; while ( xr.Close(); Console.WriteLine("Le document XML est valide"); Etape p 7: définir le ggestionnaire de validation void validation(object sender,ValidationEventArgs e) {Console.WriteLine(e.Exception);} 14 http://www.itformation.com Exercices Ecrire un programme qui crée une copie d d'un un document xml (utilisez XmlTextReader et XmlTextWriter) Ecrire une application windows forms qui affiche le contenu d'un fichier XML dans un contrôle TreeView 15 http://www.itformation.com XmlDocument XmlDocument est une représentation en mémoire d d'un un document XML sous la forme d'une arborescence DOM Classes XmlDocument (classe de base: XmlNode): Load, Save, LoadXml XmlNode (classe Abstraite):XmlNode:ChildNodes, ParentNode, FirstChild, LastChild, NextSibling,PreviousSibling g g XmlElement XmlText XmlProcessingInstruction. 16 http://www.itformation.com Utiliser la classe XmlDocument Lecture d'un document xml Méthodes: Load et LoadXml, la méthode LoadXml ne préserve pas les espaces, alors que la méthode Load préserve les espaces de type SignificantWhitespace et tous les espaces si XmlDocument.PreserveWhiteSpace est égale à true. XmlDocument xDoc = new XmlDocument(); xDoc.Load(docXml); Le paramètre docXml peut être de type : string, string stream, stream TextReader ou XmlReader. XmlReader Ajouter des nœuds dans le document Xml Méthodes pour créer des nœuds : CreateComment, CreateCDataSection, CreateDocumentFragment, CreateDocumentType, CreateDocumentFragment CreateDocumentType CreateElement, CreateElement CreateProcessingInstruction, CreateProcessingInstruction CreateTextNode, CreateXmlDeclaration, CreateWhitespace, CreateSignifi cantWhitespace. Insertion d'un nœud dans le document Xml 17 InsetBefore InsertAfter AppendChild PrependChild: ajoute le nœud au début de la liste des nœuds fils du nœud à partir duquel la méthode é h d a été é é appelée lé http://www.itformation.com Exemple 1 private XmlDocument ConstruireXmlDocument() { XmlDocument doc doc = new new XmlDocument(); XmlNode nNode; nNode = doc.CreateElement("Projet"); pp ( ); doc.AppendChild(nNode); nNode = doc.CreateElement("Tâche"); nNode.InnerText = "Code"; pp ( ); doc.DocumentElement.AppendChild(nNode); return doc; } <Projet> j <Tâche> Code </Tâche> </Projet> 18 http://www.itformation.com Exemple 2 private XmlDocument ConstruireXmlDocument2() {XmlDocument doc = new XmlDocument(); XmlElement elt; XmlText txt; elt = doc.CreateElement("Projet"); pp ( ); doc.AppendChild(elt); elt = doc.CreateElement("Tâche"); txt = doc.CreateTextNode("Code"); pp ( ); elt.AppendChild(txt); doc.DocumentElement.AppendChild(elt); return doc;} <Projet> j <Tâche> Code </Tâche> </Projet> 19 http://www.itformation.com Manipulation des nœuds Créer une copie d'un nœud: X lN d a, b; XmlNode b a = new XmlElement(); b = a.Clone(); Ou bien b=a.CloneNode(false); a.CloneNode(true) crée une copie du sous arbre dont la racine est a. Supprimer un nœud : parent.RemoveChild(XmlNode n); Modifier un nœud: Modifier la valeur d'un nœud (pour les types de nœuds qui ont une valeur): nText.Value = "text"; Remplacer un ensemble de nœuds fils:nœud.InnerXml Remplacer un nœud spécifique:nœud.ReplaceChild(nouveauNoeud,ancienNoeud); Remplacer ou supprimer un intervalle de caractères dans un nœud de type R l i i t ll d tè d d d t XmlCharacterData (XmlCDataSection, XmlComment, XmlSignificantWhiteSpace, XmlText,XmlWhitespace). noeud.ReplaceData(int position, int nombre, string texte); Définir ou modifier un attribut: element.SetAttribute("Couleur", "Bleu"); Ecrire dans un document Xml La méthode XmlDocument.WriteTo(XmlWriter xw): écrit le contenu racine.OuterXml dans le flux xw La méthode XmlDocument.WriteContentTo(XmlWriter xw): écrit le contenu racine.InnerXml dans le flux xw 20 http://www.itformation.com La collection XmlNamedNodeMap: permet d'organiser les nœuds d'un document xml non hiérarchiques: Les propriétés suivantes retournent un objet de type XmlNamedNodeMap: XmlElement.Attributes XmlDocumentType.Entities XmlDocumentType.Notations Méthodes: GetNamedItem(string nom): retourne un XmlNode Item( int index): retourne un XmlNode RemoveNamedItem(string nom) d.SetNamedItem(XmlNode n): ajoute un nœud dans la collection. La collection XmlNodeList: représente une collection de nœuds ordonnés. Les propriétés et méthodes suivantes retournent un objet de type XmlNodeList La méthode Item(int index) permet d'accéder à nœud dans la collection Pour p parcourir les nœuds de la collection XmlNodeList liste = doc.ChildNodes; foreach (XmlNode n in liste) ou bien b for f (int i=0;i<liste.Count;i++ 0 l C ++ ). 21 http://www.itformation.com Les événements é é DOM Pour chaque q action (ajout, (j suppression pp ou modification)) sur un nœud l'objet j XmlDocument gère deux événements, un événement se déclenchant avant l'action et un autre se déclenchant après l'action. Evénements: NodeChanging, NodeChanged,NodeRemoving, NodeRemoved, NodeInserting, d NodeInserting d Signature d'un événement Xml DOM: void even_xml(object source, XmlNodeChangedEventArgs e) Le paramètre e de l'événement est de type XmlNodeChangedEventArgs, propriétés: Action: une énumération de type XmlNodeChangedAction, g les valeurs possibles sont: Change,Remove,Insert OldParent NewParent OldValue ld l NewValue Node 22 http://www.itformation.com Exemple: doc.NodeRemoved += new XmlNodeChangedEventHandler(apres_suppression); void apres_suppression (object sender, XmlNodeChangedEventArgs e) {MessageBox.Show("Node " + e.Node.Name + " Supprimé");} Modifier o e ou définir é laa déclaration éc a at o XML xDecl = xDoc.CreateXmlDeclaration("1.0", "ISO-8859-1", "yes"); 23 http://www.itformation.com