Utilisation du type de données xml dans les applications clientes Visual Studio

Cette fonctionnalité sera supprimée dans une prochaine version de Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.

Le type de données xml vous permet de stocker des fragments XML, tels qu'une instance XML dépourvue d'un élément unique de niveau supérieur, et des documents XML valides dans une base de données SQL Server. En raison de cette caractéristique conceptuelle, les instances de type de données xml doivent être mappées dans Visual Studio 2005 à un tableau de System.Xml.XmlNode au lieu d'être retournées sous forme de System.Xml.XmlDocument. Le code XML fragmenté n'est pas pris en charge.

En utilisant directement le tableau de XmlNode contenu dans la valeur d'instance de type de données xml, vous noterez des différences dans la manière dont fonctionnent les propriétés de membre InnerXml et OuterXml, notamment lorsque l'instance de type de données xml forme un document XML valide, par exemple, lorsqu'il possède un élément unique de niveau supérieur.

Par exemple, supposons que les lignes de code suivantes initient une nouvelle instance d'un point de terminaison SQL Server (MyServer.sql_endpoint) en tant que proxy Web possédant une méthode Web GetSomeXml) qui retourne une valeur d'instance de ligne de type de données xml :

MyServer.sql_endpoint proxy = new MyServer.sql_endpoint();
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
SqlXmlDt = proxy.MyServerdboGetSomeXml();
System.Xml.XmlNode[] nodeArr = SqlXmlDt.Any;
string xmlJustChildren = nodeArr[0].InnerXml;
string xmlWithRoot = nodeArr[0].OuterXml;

La valeur de ligne de type de données xml retournée possède les données suivantes :

<root><child/><child/></root>

Si les propriétés InnerXml et OuterXml de nodeArr[0] sont ensuite affectées à une paire de variables de chaîne (xmlJustChildren et xmlWithRoot), comme indiqué dans le code précédent, la valeur de nodeArr[0].InnerXml ne comprend que les nœuds contenus dans l'élément en cours (les deux éléments <child/> mais pas l'élément <root> lui-même) et nodeArr[0].OuterXml fonctionne normalement, y compris tous les nœuds du tableau de XmlNodes (les éléments <child/> ainsi que l'élément <root>).

Ce comportement diffère de ce que vous pouvez généralement constater si vous utilisez plus fréquemment XmlDocument car cette classe n'implémente pas les propriétés InnerXml et OuterXml de la même manière. Dans le cas des instances XmlDocument, l'instance de document fait office d'élément wrapper pour tous les XmlNodes du document. Cela englobe le nœud racine de niveau supérieur et tous les schémas ou DTD en ligne éventuellement présents dans le document. Par conséquent, le contenu de XmlDocument.InnerXml est le même que celui de XmlDocument.OuterXml.

En raison de ces caractéristiques d'implémentation, vous pouvez à juste titre utiliser System.Xml.XmlDocumentFragment pour manipuler des instances de type de données SQL Serverxml dans les applications clientes qui recourent au service Web XML natif. La classe XmlDocumentFragment est davantage familière aux développeurs habitués à utiliser XmlDocument, et XmlDocumentFragment accepte un tableau de XmlNode sans problème.

Exemples de code à l'appui, les sections ci-après donnent une vue d'ensemble de l'utilisation de XmlDocumentFragment pour manipuler des valeurs d'instance de type de données SQL Serverxml dans les applications clientes.

Traitement de la sortie à l'aide de XmlDocumentFragment

Les lignes de code ci-dessous montrent comment placer un tableau de XmlNode dans un XmlDocumentFragment, puis sélectionner des nœuds dans le fragment à l'aide d'une expression XPath.

System.Xml.XmlDocumentFragment fragOut = SqlXmlDt.Any[0].OwnerDocument.CreateDocumentFragment();

//  Loop over your XmlNode array and populate your XmlDocumentFragment.
foreach (System.Xml.XmlNode xmlnode in SqlXmlDt.Any)
{
    fragOut.AppendChild(xmlnode);
}

//  Loop over your XPath expression/selection for results.
foreach (System.Xml.XmlNode xmlpath in fragOut.SelectNodes("//bar"))
{
    System.Console.WriteLine(xmlpath.OuterXml);
}

Création d'un tableau en entrée avec une chaîne à l'aide de XmlDocumentFragment

Les lignes de code ci-dessous montrent comment créer un tableau d'entrée de XmlNode en attribuant une chaîne à la propriété InnerXml de XmlDocumentFragment.

//  Create an owning XmlDocument
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();

//  Create your XmlDocumentFragment.
System.Xml.XmlDocumentFragment fragIn = xmldoc.CreateDocumentFragment();

//  Fill the XmlDocumentFragment with a string.
fragIn.InnerXml =
"  <a>" +
"    <b>inputvalue</b>" +
"  </a>" +
"  topstuff" +
"  <b/>";

//  Create an XmlNode array (should never require more than one element).
System.Xml.XmlNode[] xmlnodes = new System.Xml.XmlNode[1];

//  Put the XmlDocumentFragment in the array and fill your XmlDt
xmlnodes[0] = (System.Xml.XmlNode) fragIn;
SqlXmlDt.Any = xmlnodes;

Création d'un tableau à partir d'un fichier à l'aide de XmlDocumentFragment

La classe XmlDocumentFragment est plus limitée que la classe XmlDocument en ce qui concerne le remplissage d'une instance. L'exemple ci-dessous montre comment remplir une instance XmlDocumentFragment à partir d'un fichier à l'aide de System.Xml.XmlReader.

//  Create an owning XmlDocument.
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();

//  Create your XmlDocumentFragment.
System.Xml.XmlDocumentFragment fragIn = xmldoc.CreateDocumentFragment();

//  Build an XmlReader from the file.
System.Xml.XmlReaderSettings rs = new System.Xml.XmlReaderSettings();
rs.ConformanceLevel = System.Xml.ConformanceLevel.Fragment;
System.Xml.XmlReader reader = System.Xml.XmlReader.Create("c:\\file.xml", rs);

//  Populate the fragment with the nodes from the XmlReader.
System.Xml.XmlNode child;
while (null != (child = xmldoc.ReadNode(reader)))
     fragIn.AppendChild(child);

//  Create your XmlNode array (should never require more than one element)
    System.Xml.XmlNode[] xmlnodes = new System.Xml.XmlNode[1];

//  Put the XmlDocumentFragment in the array and fill our XmlDt.
xmlnodes[0] = (System.Xml.XmlNode) fragIn;
SqlXmlDt.Any = xmlnodes;