[ Linq To Xml ] – Quelques points
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- un commentaire -->
<?xml-stylesheet type="text/xsl"
href="Contacts.xslt"?>
<Contacts>
<Contact genre="Amis">
<ContactID>1</ContactID>
<ContactName>Dupond</ContactName>
<ContactFirstName>éric</ContactFirstName>
<ContactEmail>edupond@hotmail.com</ContactEmail>
</Contact>
<Contact genre="Famille">
<ContactID>2</ContactID>
<ContactName>Bellin</ContactName>
<ContactFirstName>marie</ContactFirstName>
<ContactEmail>mb@hotmail.com</ContactEmail>
</Contact>
<Contact>
<ContactID>3</ContactID>
<ContactName>Martin</ContactName>
<ContactFirstName>jacques</ContactFirstName>
<ContactEmail>jm@hotmail.com</ContactEmail>
</Contact>
</Contacts>
|
I Petit tour d’horizon
Un XDocument récupère l’ensemble du document XML (déclaration,xprocessinginstruction,etc.)
Un XElement ne récupère que le root (pas la déclaration)
|
System.Xml.Linq.XDocument oXDocument = System.Xml.Linq.XDocument.Load(@"C://Documents and Settings//romagny//Mes documents//Access//XML//Contacts.xml");
System.Xml.Linq.XElement oXElement = System.Xml.Linq.XElement.Load(@"C://Documents and Settings//romagny//Mes documents//Access//XML//Contacts.xml");
|
Ø Les methods Parse,ReadFrom permettent également de charger un document Xml
A noter on peut parfaitement intégrer Load avec un select par exemple
|
IEnumerable<XElement> Query = XElement.Load(oOpenFileDialog.FileName).Elements().Select<XElement, XElement>(delegate(XElement el)
{
return el;
});
|
1 Déclaration
|
// recupèrer la déclaration >> <?xml version="1.0" encoding="utf-8" standalone="yes"?>
System.Xml.Linq.XDeclaration oXDeclaration =
oXDocument.Declaration;
string encoding = oXDocument.Declaration.Encoding;
string version = oXDocument.Declaration.Version;
string standalone =
oXDocument.Declaration.Standalone;
|
Créer l’XDeclaration du document
|
System.Xml.Linq.XDocument oXDocument = new
System.Xml.Linq.XDocument(new System.Xml.Linq.XDeclaration("1.0", "utf-8", "yes"));
|
2 Récupération du root
|
// sélection element root
System.Xml.Linq.XElement oXElement =
oXDocument.Root;
// ou
System.Xml.Linq.XElement oXElement =
oXDocument.Element("Contacts") ;
|
3 Attributs
|
// selection de tous les attributs de l’element
var Query =
from xa in oXDocument.Root.Elements("Contact").ElementAt(0).Attributes()
select xa;
IEnumerable<System.Xml.Linq.XAttribute> Query = this.oXDocument.Root.Elements("Contact").ElementAt<System.Xml.Linq.XElement>(0).Attributes().Select<System.Xml.Linq.XAttribute, System.Xml.Linq.XAttribute>(delegate(System.Xml.Linq.XAttribute xa)
{
return xa;
});
// selection d’un attribut spécifique de l’element
var Query =
oXDocument.Root.Elements("Contact").ElementAt(0).Attribute("genre");
System.Xml.Linq.XAttribute Query = this.oXDocument.Root.Elements("Contact").ElementAt<System.Xml.Linq.XElement>(0).Attribute("genre");
|
4 Namespaces
Ø Lecture
|
// récupérer les namespaces
List<System.Xml.Linq.XNamespace> LstXNamespaces = new List<System.Xml.Linq.XNamespace>();
foreach (System.Xml.Linq.XElement oXElement in oXDocument.Root.DescendantsAndSelf())
{
if
(!LstXNamespaces.Contains(oXElement.Name.Namespace) && oXElement.Name.Namespace != System.Xml.Linq.XNamespace.Blank &&
oXElement.Name.Namespace != System.Xml.Linq.XNamespace.Xml && oXElement.Name.Namespace != System.Xml.Linq.XNamespace.Xmlns)
{
LstXNamespaces.Add(oXElement.Name.Namespace);
}
foreach
(System.Xml.Linq.XAttribute oXAttribute in oXElement.Attributes())
{
if
(!LstXNamespaces.Contains(oXAttribute.Name.Namespace) && oXAttribute.Name.Namespace != System.Xml.Linq.XNamespace.Blank &&
oXAttribute.Name.Namespace != System.Xml.Linq.XNamespace.Xml && oXAttribute.Name.Namespace != System.Xml.Linq.XNamespace.Xmlns)
{
LstXNamespaces.Add(oXAttribute.Name.Namespace);
}
}
}
|
Voir si un attribut est une déclaration de namespace > propriété IsNamespaceDeclaration à true
Récupèrer le prefix >> oXAttribute.Name.LocalName > retourne le prefix « xs » par exemple
Note : DescendantsAndSelf() effectue une récursive
Ø Création de XElement avec XNamespace
|
// simple <NomBalise>valeur</NomBalise>
oXElement = new System.Xml.Linq.XElement("NomBalise", "valeur");
// avec XNamespace <NomBalise xmlns="http://www.monnamespace.com">Valeur</NomBalise>
System.Xml.Linq.XNamespace oXNamespace = "http://www.monnamespace.cm";
oXElement = new
System.Xml.Linq.XElement(oXNamespace + "NomBalise", "Valeur");
// > inclure le namespace à tous les XElement
l'utilisant
// Prefix + XNamespace
// <xs:NomBalise
xmlns:xs="http://www.monnamespace.com">Valeur</xs:NomBalise>
System.Xml.Linq.XNamespace oXNamespace = "http://www.monnamespace.com";
oXElement = new
System.Xml.Linq.XElement(oXNamespace + "NomBalise", "Valeur",
new System.Xml.Linq.XAttribute(System.Xml.Linq.XNamespace.Xmlns + "xs", oXNamespace)
);
// plusieurs balises ayant le même prefix
// >> ne declarer l'attribut avec le namespace que pour
la première balise
//<xs:NomBalise
xmlns:xs="http://www.monnamespace.com">
// <xs:NomBalise2>Valeurbalise2</xs:NomBalise2>
// <xs:NomBalise3>Valeurbalise3</xs:NomBalise3>
//</xs:NomBalise>
System.Xml.Linq.XNamespace oXNamespace = "http://www.monnamespace.com";
oXElement = new System.Xml.Linq.XElement(oXNamespace + "NomBalise",
new System.Xml.Linq.XAttribute(System.Xml.Linq.XNamespace.Xmlns + "xs", oXNamespace),
new System.Xml.Linq.XElement(oXNamespace + "NomBalise2","Valeurbalise2"),
new System.Xml.Linq.XElement(oXNamespace + "NomBalise3", "Valeurbalise3")
);
|
II RECUPERATION D’UNE VALEUR OU UN ELEMENT EN RESULTAT
Récupération d’un XElement
|
var Query =
(from x in oXDocument.Root.Elements("Contact")
select
x).First<System.Xml.Linq.XElement>();
//
System.Xml.Linq.XElement Query = this.oXDocument.Root.Elements("Contact").Select<System.Xml.Linq.XElement,
System.Xml.Linq.XElement>(delegate(System.Xml.Linq.XElement x)
{
return x;
}).First<XElement>();
|
Récupération d’une valeur
|
var Query = oXDocument.Root.Elements("Contact").ElementAt(0).Element("ContactName").Value;
//
string Query = this.oXDocument.Root.Elements("Contact").ElementAt<System.Xml.Linq.XElement>(0).Element("ContactName").Value;
|
III RECUPERATION D’UNE LISTE EN RESULTAT
- le résultat est stocké dans IEnumerable<XElement> si pas
de « clause « orderby
si il y a une clause ORDERBY (un trie donc) le résultat est stocké dans un IOrderedSequence<XElement>
- la clause SELECT n’est pas obligatoire dès l’instant ou il y a une clause
where ou orderby
- les méthodes anonymes sont utilisées pour :
o where > pour vérifier une condition et renvoyer (true ou false)
o orderby > pour spécifierla valeur de l’élément (ou attribut) de trie
- orderby est utilisé pour un trie ascendant(ascending)
- orderbydescending est utilisé pour un trie décroissant (descending)
SELECT SIMPLE
|
//selection de tous les contacts
// il faut donner l'arborescence exacte
var Query =
from x in oXDocument.Root.Elements("Contact")
select x;
// ou
IEnumerable<System.Xml.Linq.XElement> Query =
this.oXDocument.Root.Elements("Contact").Select<System.Xml.Linq.XElement, System.Xml.Linq.XElement>(delegate(System.Xml.Linq.XElement x)
{
return
x;
}
);
|
AVEC WHERE
|
var Query =
from x in oXDocument.Root.Elements("Contact")
where x.Element("ContactName").Value.StartsWith("B")
select x;
// ou
IEnumerable<System.Xml.Linq.XElement> Query = this.oXDocument.Root.Elements("Contact").Where<System.Xml.Linq.XElement>(delegate(System.Xml.Linq.XElement x)
{
return
x.Element("ContactName").Value.StartsWith("B");
});
|
AVEC ORDERBY
|
// trie sur ContactName
var Query =
from
x in oXDocument.Root.Elements("Contact")
orderby x.Element("ContactName").Value ascending
select x;
// Ou
IOrderedSequence<System.Xml.Linq.XElement> Query = this.oXDocument.Root.Elements("Contact").OrderBy<System.Xml.Linq.XElement, string>(delegate(System.Xml.Linq.XElement
x)
{
return x.Element("ContactName").Value;
});
|
AVEC WHERE ET ORDERBY
|
var Query =
from x in oXDocument.Root.Elements("Contact")
where x.Element("ContactName").Value.StartsWith("B")
orderby x.Element("ContactName").Value descending
select x;
// ou
IOrderedSequence<XElement> Query =
this.oXDocument.Root.Elements("Contact").Where<XElement>(delegate(XElement
x)
{
return x.Element("ContactName").Value.StartsWith("B");
}).OrderByDescending<XElement, string>(delegate(XElement x)
{
return x.Element("ContactName").Value;
});
|
