Je possède un code qui lit un fichier xml. Il y a quelques parties que je ne comprends pas. De ce que je comprends, le code va créer un fichier xml avec 2 éléments, "Produit" et "AutresDétails". Comment se fait-il que nous devions utiliser writer.WriteEndElement(); une seule fois alors que nous avons utilisé writer.WriteStartElement deux fois ? Ne devrions-nous pas fermer chaque instruction writer.WriteStartElement avec une instruction writer.WriteEndElement ?
using System.Xml;
public class Program
{
public static void Main()
{
XmlWriterSettings paramètres = new XmlWriterSettings();
paramètres.Indent = true;
XmlWriter writer = XmlWriter.Create("Produits.xml", paramètres);
writer.WriteStartDocument();
writer.WriteComment("Ce fichier est généré par le programme.");
writer.WriteStartElement("Produit"); // première s
writer.WriteAttributeString("ID", "001");
writer.WriteAttributeString("Nom", "Savon");
writer.WriteElementString("Prix", "10.00");
// Deuxième élément
writer.WriteStartElement("AutresDétails");
writer.WriteElementString("NomMarque", "Savon X");
writer.WriteElementString("Fabricant", "Compagnie X");
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
writer.Close();
}
}
using System;
using System.Xml;
public class Program
{
public static void Main()
{
XmlReader reader = XmlReader.Create("Produits.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "Produit")
{
Console.WriteLine("ID = " + reader.GetAttribute(0));
Console.WriteLine("Nom = " + reader.GetAttribute(1));
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
if (reader.Name == "Prix")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
if (reader.NodeType == XmlNodeType.Text)
{
Console.WriteLine("Prix = {0:C}", Double.Parse(reader.Value));
}
}
reader.Read();
} //fin if
if (reader.Name == "AutresDétails")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
if (reader.Name == "NomMarque")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
if (reader.NodeType == XmlNodeType.Text)
{
Console.WriteLine("Nom de la marque = " + reader.Value);
}
}
reader.Read();
} //fin if
if (reader.Name == "Fabricant")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
if (reader.NodeType == XmlNodeType.Text)
{
Console.WriteLine("Fabricant = " + reader.Value);
}
}
} //fin if
}
} //fin if
} //fin tant que
} //fin if
} //fin tant que
}
}
Je ne comprends pas cette partie :
if (reader.Name == "AutresDétails")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
if (reader.Name == "NomMarque")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
if (reader.NodeType == XmlNodeType.Text)
{
Console.WriteLine("Nom de la marque = " + reader.Value);
}
}
remarquez comment la condition while (reader.NodeType != XmlNodeType.EndElement)
a été utilisée deux fois ?
pourquoi n'avons-nous pas à spécifier
if (reader.NodeType == XmlNodeType.Element pour AutresDétails)
comme nous l'avons fait pour Produit,
comme ceci
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "AutresDétails")
{}