Arbeiten mit dem xml-Datentyp in Visual Studio-Clientanwendungen
Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.
Der xml-Datentyp ermöglicht das Speichern von XML-Fragmenten (wie z. B. einer XML-Instanz, der ein einzelnes Element der obersten Ebene fehlt) und von gültigen XML-Dokumenten in einer SQL Server-Datenbank. Aufgrund dieser Designeigenschaft müssen die Instanzen des Datentyps xml in Visual Studio 2005 einem Array von System.Xml.XmlNode zugeordnet werden und nicht als System.Xml.XmlDocument zurückgegeben werden. Damit wird fragmentiertes XML nicht unterstützt.
Beim direkten Arbeiten mit dem Array von XmlNode, das im Instanzenwert des Datentyps xml enthalten ist, werden Sie Unterschiede in der Funktionsweise der Eigenschaften der InnerXml- und OuterXml-Mitglieder feststellen, insbesondere in dem Fall, wenn die xml-Datentypinstanz ein gültiges XML-Dokument bildet, so als ob es ein einzelnes Element auf oberster Ebene enthält.
Angenommen, Sie haben beispielsweise die folgenden Codezeilen zur Initiierung einer neuen Instanz eines SQL Server-Endpunkts (MyServer.sql_endpoint) als ein Webproxy, das über eine Webmethode (GetSomeXml) verfügt, die einen Zeileninstanzwert des Datentyps xml zurückgibt:
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;
Der zurückgegebene xml-Datentypzeilenwert hat dann die folgenden Daten:
<root><child/><child/></root>
Wenn dann die InnerXml- und OuterXml-Eigenschaften für nodeArr[0] einem Paar von Zeichenkettenvariablen (xmlJustChildren und xmlWithRoot) zugewiesen werden, wie das im vorherigen Code gezeigt wird, schließt der Wert von nodeArr[0].InnerXml nur Knoten ein, die im aktuellen Element (beide <child/>-Elemente, aber nicht das <root>-Element selbst) enthalten sind, und nodeArr[0].OuterXml arbeitet wie erwartet: einschließlich aller Knoten im Array von XmlNodes (die <child/>-Elemente und auch das <root>-Element).
Beachten Sie, dass dieses Verhalten von dem abweicht, was Sie evtl. sonst sehen, wenn Sie häufiger mit XmlDocument arbeiten, weil diese Klasse die InnerXml- und OuterXml-Eigenschaften auf andere Weise implementiert. Für XmlDocument-Instanzen agiert die Dokumentinstanz als Wrapperelement für alle XmlNodes im Dokument. Das schließt den Stammknoten auf der obersten Ebene sowie alle Inline-DTDs oder -Schemas ein, die eventuell im Dokument vorhanden sind. Deshalb ist der Inhalt von XmlDocument.InnerXml derselbe wie der von XmlDocument.OuterXml.
Aufgrund dieser Implementierungsspezifika ist die Verwendung von System.Xml.XmlDocumentFragment eine gute Alternative für die Zusammenarbeit mit SQL Serverxml-Datentypinstanzen in Clientanwendungen, die mit dem Native XML Web Service arbeiten. Die XmlDocumentFragment-Klasse wird Entwicklern vertrauter sein, die bisher mit XmlDocument gearbeitet haben, und XmlDocumentFragment akzeptiert problemlos ein Array von XmlNode.
Die folgenden Abschnitte enthalten den Code sowie einen Überblick zum Verwenden von XmlDocumentFragment zur Zusammenarbeit mit SQL Serverxml-Datentypinstanzwerten in Clientanwendungen.
Verarbeiten der Ausgabe durch Verwenden von XmlDocumentFragment
Die folgenden Codezeilen zeigen, wie ein Array von XmlNode in ein XmlDocumentFragment übertragen wird und anschließend die Knoten aus dem Fragment durch Verwendung eines XPath-Ausdrucks ausgewählt werden.
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);
}
Erstellen einer Eingabe mit einer Zeichenfolge durch Verwenden von XmlDocumentFragment
Das folgende Beispiel zeigt das Erstellen eines Eingabe-Arrays von XmlNode durch Verwendung einer Zeichenkettenzuweisung für die InnerXml-Eigenschaft von 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;
Erstellen einer Eingabe aus einer Datei durch Verwenden von XmlDocumentFragment
Im Hinblick auf das Auffüllen einer Instanz unterliegt die XmlDocumentFragment-Klasse stärkeren Einschränkungen als die XmlDocument-Klasse. Das folgende Beispiel zeigt das Auffüllen einer XmlDocumentFragment-Instanz aus einer Datei durch Verwenden von 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;
Siehe auch