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