Freigeben über


Vorgehensweise: Arbeiten mit den Klassen \"XPathNavigator\" und \"XPathNodeIterator\"

Viele Members des Objektmodells mit verwaltetem Code, das vom Microsoft.Office.InfoPath-Namespace bereitgestellt wird, erstellen entweder eine Instanz der XPathNavigator-Klasse des System.Xml.XPath-Namespace, oder diese Instanz wird an sie übergeben, um auf die XML-Daten in Datenquellen von Formularvorlagen zuzugreifen und sie zu bearbeiten. Wenn Sie Zugriff auf einXPathNavigator-Objekt erhalten haben, das von einem InfoPath-Objektmodellmember zurückgegeben wird, können Sie die Eigenschaften und Methoden der XPathNavigator-Klasse verwenden, um mit den Daten zu arbeiten.

Der am häufigsten verwendete Member des Microsoft.Office.InfoPath-Namespace, der die XPathNavigator-Klasse verwendet, ist die CreateNavigator-Methode der DataSource-Klasse, die es Ihnen ermöglicht, mit den gespeicherten Daten zu arbeiten, die durch ein DataSource-Objekt dargestellt werden. Von der CreateNavigator-Methode wird ein XPathNavigator-Objekt am Stamm der Datenquelle erstellt, die vom DataSource-Objekt dargestellt wird.

Tipp

Wenn Sie mit der Verwendung von MSXML5 aus Skript zum Arbeiten mit Daten in Microsoft InfoPath 2003 vertraut sind, können Sie sich die CreateNavigator-Methode als Ersatz für die DOM-Eigenschaft von DataObject vorstellen.

Verwenden der "XPathNavigator"-Klasse für den Zugriff auf die Hauptdatenquelle des Formulars

Rufen Sie für den Zugriff auf die Hauptdatenquelle des Formulars die CreateNavigator-Methode direkt über das Schlüsselwort this (C#) oder Me (Visual Basic) auf. Im folgenden Codebeispiel wird ein XPathNavigator-Objekt am Stamm der Hauptdatenquelle mithilfe der CreateNavigator-Methode erstellt, und dann wird die OuterXml-Eigenschaft der XPathNavigator-Klasse verwendet, um den zurückgegebenen XML-Code in einem Meldungsfeld anzuzeigen.

XPathNavigator myNavigator = 
   this.CreateNavigator();
MessageBox.Show("Main data source XML: " +
   myNavigator.OuterXml.ToString());
Dim myNavigator As XPathNavigator  = _
   Me.CreateNavigator()
MessageBox.Show("Main data source XML: " & _
   myNavigator.OuterXml.ToString())

Hinweis

Das Aufrufen der CreateNavigator-Methode direkt über das Schlüsselwort this oder Me entspricht dem Aufrufen der CreateNavigator-Methode über die MainDataSource-Eigenschaft (this.MainDataSource.CreateNavigator()) oder dem Übergeben einer leeren Zeichenfolge an die DataSources-Eigenschaft der XmlForm-Klasse (this.DataSources[""].CreateNavigator()).

Auswählen und Festlegen der XML-Knoten für Felder in der Hauptdatenquelle

Verwenden Sie zum Auswählen des einzelnen XML-Knotens für ein Feld in einer Datenquelle die SelectSingleNode(String,IXmlNamespaceResolver)-Methode der XPathNavigator-Klasse. Wenn Sie mit einem Satz wiederholter Felder oder wiederholten Gruppen arbeiten möchten, verwenden Sie die Select(String,IXmlNamespaceResolver)-Methode der XPathNavigator-Klasse. Diese Methode gibt ein XPathNodeIterator-Objekt zurück, das eine Auflistung von Knoten darstellt.

Auswählen und Festlegen des Werts eines einzelnen Knotens

Die überladene SelectSingleNode-Methode, die Sie verwenden müssen, hat einen xpath-Parameter, der einen XPath-Ausdruck als Zeichenfolge nutzt, und einen resolver-Parameter, der ein XmlNamespaceManager-Objekt zum Auflösen von Namespacepräfixen verwendet. Übergeben Sie zum Auswählen eines einzelnen Knotens in der Hauptdatenquelle des Formulars einen XPath-Ausdruck, der das Feld oder die Gruppe angibt, die Sie für den xpath-Parameter auswählen möchten, sowie das XmlNamespaceManager-Objekt, das von der NamespaceManager-Eigenschaft des XmlForm-Objekts zurückgegeben wird. Das zurückgegebene XmlNamespaceManager-Objekt wird mit allen Namespates, die in der Formulardefinitionsdatei (XSF) der Formularvorlage definiert sind, zum Ladezeitpunkt initialisiert.

Tipp

Die einfachste Möglichkeit zum Erstellen eines XPath-Ausdrucks zum Auswählen eines Knotens in der Datenquelle des Formulars ist das Klicken mit der rechten Maustaste im Aufgabenbereich Felder auf das Feld oder die Gruppe und anschließende Klicken auf XPath kopieren. Fügen Sie zum Erstellen und Testen manuell bearbeiteter XPath-Ausdrücke für den Zugriff auf Knoten in einem komplexen oder überaus geschachtelten XML-Schema dem Formular ein Steuerelement vom Typ Ausdrucksfeld hinzu. Geben Sie dann den XPath-Ausdruck für das Steuerelement an, und zeigen Sie anschließend eine Vorschau des Formulars an, um die Ergebnisse anzuzeigen.

Das folgende Beispiel verwendet die SelectSingleNode-Methode zum Auswählen des einzelnen Knotens für das EmailAlias-Feld. Danach verwendet es die SetValue-Methode der XPathNavigator-Klasse und die UserName-Eigenschaft der User-Klasse zum Festlegen des Werts des Felds für den Alias des aktuellen Benutzers.

XPathNavigator emailAlias = 
   this.CreateNavigator().SelectSingleNode(
      "/my:myFields/my:EmailAlias", NamespaceManager);
emailAlias.SetValue(this.Application.User.UserName.ToString());
Dim emailAlias As XPathNavigator = _
   Me.CreateNavigator().SelectSingleNode( _
      "/my:myFields/my:EmailAlias", NamespaceManager)
emailAlias.SetValue(Me.Application.User.UserName.ToString())

Weitere Informationen zum Erstellen von XPath-Ausdrücken finden Sie in der XPath-Referenz auf der MSDN-Website und in XML Path Language (XPath) Version 1.0 W3C Recommendation.

Festlegen des Werts eines Knotens mit dem Attribut "xsi:nil"

Bei bestimmten Datentypen wird beim Versuch, den Wert eines leeren Felds programmgesteuert festzulegen, der Fehler "Nicht datentypbezogene Fehler bei der Schemaüberprüfung" angezeigt. Die Ursache dieses Fehlers ist in der Regel, dass das xsi:nil-Attribut auf true festgelegt ist. Wenn Sie das zugrunde liegende XML-Element des leeren Felds im Formular untersuchen, können Sie diese Einstellung erkennen. Im XML-Fragment des folgenden leeren "Date"-Felds ist z. B. das xsi:nil-Attribute auf true festgelegt.

<my:myDate xsi:nil="true"></my:myDate>

Wenn das xsi:nil-Attribut auf true festgelegt ist, bedeutet dies, dass das Element zwar vorhanden ist, aber keinen Wert hat, also Null ist. Wenn Sie versuchen, den Wert eines solchen Knotens programmgesteuert festzulegen, zeigt InfoPath die Meldung "Nicht datentypbezogene Fehler bei der Schemaüberprüfung" an, da das Element gegenwärtig als Null gekennzeichnet ist. InfoPath legt das xsi:nil-Attribut für Null-Felder der folgenden Datentypen auf true fest:

  • Whole Number (integer)

  • Decimal (double)

  • Date (date)

  • Time (time)

  • Date and Time (dateTime)

Zum Vermeiden dieses Fehlers muss Ihr Code prüfen, ob das xsi:nil-Attribut vorhanden ist, und falls ja, es entfernen, bevor der Wert des Knotens festgelegt wird. Die folgende Unterroutine verwendet ein XpathNavigator-Objekt am Knoten, den Sie festlegen möchten, sucht nach dem nil-Attribut und löscht es, sofern vorhanden.

public void DeleteNil(XPathNavigator node)
{
   if (node.MoveToAttribute(
      "nil", "http://www.w3.org/2001/XMLSchema-instance"))
      node.DeleteSelf();
}
Public Sub DeleteNil(ByVal node As XPathNavigator)
   If (node.MoveToAttribute( _
      "nil", "http://www.w3.org/2001/XMLSchema-instance")) Then
      node.DeleteSelf()
   End If
End Sub

Sie können diese Unterroutine aufrufen, bevor Sie versuchen, ein Feld eines Datentyps festzulegen, das ggf. das xsi:nil-Attribut aufweist (siehe das folgende Beispiel, das ein "Date"-Feld festlegt).

// Access the main data source.
XPathNavigator myForm = this.CreateNavigator();

// Select the field.
XPathNavigator myDate = myForm.SelectSingleNode("/my:myFields/my:myDate", NamespaceManager);

// Check for and remove the "nil" attribute.
DeleteNil(myDate);

// Build the current date in the proper format. (yyyy-mm-dd)
string curDate = DateTime.Today.Year + "-" + DateTime.Today.Month + 
   "-" + DateTime.Today.Day;

// Set the value of the myDate field.
myDate.SetValue(strCurDate);
' Access the main data source.
Dim myForm As XPathNavigator = Me.CreateNavigator()

' Select the field.
Dim myDate As XPathNavigator = _
   myForm.SelectSingleNode("/my:myFields/my:myDate", NamespaceManager)

' Check for and remove the "nil" attribute.
DeleteNil(myDate)

' Build the current date in the proper format. (yyyy-mm-dd)
Dim curDate As String = DateTime.Today.Year + "-" + _
   DateTime.Today.Month + "-" + DateTime.Today.Day

' Set the value of the myDate field.
myDate.SetValue(strCurDate)

Hinweis

Wenngleich die Implementierung des XPathNavigator-Objekts in InfoPath die SetTypedValue-Methode verfügbar macht, die dazu dient, einen Knoten mithilfe eines Werts eines bestimmten Typs festzulegen, implementiert InfoPath diese Methode nicht. Sie müssen stattdessen die SetValue-Methode verwenden und einen Zeichenfolgenwert im ordnungsgemäßen Format für den Datentyp des Knotens übergeben.

Auswählen und Festlegen eines Satzes wiederholter Knoten

Verwenden Sie zum Angeben eines Satzes wiederholter Felder oder Gruppen mit unbestimmter Anzahl die Select-Methode der XPathNavigator-Klasse. Diese Methode gibt ein XPathNodeIterator-Objekt zurück, mit dem Sie die angegebene Auflistung von Knoten durchlaufen können.

Das folgende Beispiel setzt voraus, dass Ihre Formularvorlage eine Aufzählung oder ein ähnliches wiederholtes Steuerelement enthält, das an ein wiederholtes Element mit Namen field1 gebunden ist. Der XPath-Ausdruck des Felds wird an die Select-Methode übergeben, und das zurückgegebene XPathNodeIterator-Element wird der nodes-Variablen zugewiesen. Mithilfe der MoveNext-Methode durchlaufen Sie die Auflistung der Knoten, und die Current-Eigenschaft gibt ein XPathNavigator-Objekt mit einer Position im aktuellen Knoten zurück. Schließlich verwenden Sie die Value-Eigenschaft zum Abrufen und Anzeigen des Werts jedes wiederholten Felds.

string message = String.Empty;
XPathNavigator root = this.CreateNavigator();
XPathNodeIterator nodes = 
   root.Select("/my:myFields/my:group1/my:field1", NamespaceManager);

while (nodes.MoveNext())
{
    message += nodes.Current.Value + System.Environment.NewLine;
}
MessageBox.Show(message);
Dim message As String = String.Empty
Dim root As XPathNavigator = Me.CreateNavigator()
Dim nodes As XPathNodeIterator = _
   root.Select("/my:myFields/my:group1/my:field1", NamespaceManager)

Do While nodes.MoveNext
    message += nodes.Current.Value & System.Environment.NewLine
Loop

MessageBox.Show(message)

Das vorherige Beispiel funktioniert mit Zeichenfolgenwerten im angegebenen wiederholten Feld. Wenn das Feld jedoch numerische Werte enthält, können Sie ähnlichen Code verwenden, um die Werte im Feld für Berechnungen, z. B. der Summe der Werte oder ihres Durchschnitts, zu durchlaufen.

Anstatt die Value-Eigenschaft zum Abrufen des Werts jeder Instanz des wiederholten Felds zu verwenden, können Sie auch mithilfe derSetValue-Methode die Felder durchlaufen und ihre Werte festlegen (siehe das folgende Beispiel).

XPathNavigator root = this.CreateNavigator();
XPathNodeIterator nodes = 
   root.Select("/my:myFields/my:group1/my:field1", NamespaceManager);
int myInt = 1;
while (nodes.MoveNext())
{
   nodes.Current.SetValue(myInt.ToString());
   myInt = myInt + 1;
}
Dim root As XPathNavigator = Me.CreateNavigator()
Dim nodes As XPathNodeIterator = _
   root.Select("/my:myFields/my:group1/my:field1", NamespaceManager)
Dim myInt As Integer = 1
Do While nodes.MoveNext
   nodes.Current.SetValue(myInt.ToString())
   myInt = myInt + 1
Loop

Verwenden der "XPathNavigator"-Klasse für den Zugriff auf eine externe Datenquelle

Übergeben Sie für den Zugriff auf eine externe Datenquelle, die dem Formular zugeordnet ist, den Namen der Datenquelle an die DataSources-Eigenschaft der XmlForm-Klasse. Klicken Sie zum Herstellen einer Verbindung mit einer neuen externen Datenquelle oder zum Anzeigen einer Liste der Namen der vorhandenen Verbindungen mit externen Datenquellen im Menüband auf der Registerkarte Daten auf Datenverbindungen.

Im folgenden Codebeispiel wird gezeigt, wie ein XPathNavigator-Objekt am Stamm einer externen Datenquelle mit dem Namen "CityList" mithilfe der CreateNavigator-Methode erstellt wird und dann die OuterXml-Eigenschaft der XPathNavigator-Klasse verwendet wird, um den zurückgegebenen XML-Code in einem Meldungsfeld anzuzeigen. Dieses Codebeispiel geht davon aus, dass Sie eine Datenverbindung mit einer Liste von Ortsnamen erstellt haben, die in einer externen Datenquelle gespeichert sind, z. B. in einem XML-Dokument oder einer SharePoint-Liste, und die Datenverbindung "CityList" genannt haben.

XPathNavigator myNavigator = 
   this.DataSources["CityList"].CreateNavigator();
MessageBox.Show("External data source XML: " + 
   myNavigator.OuterXml.ToString());
Dim myNavigator As XPathNavigator  = _
   Me.DataSources("CityList").CreateNavigator()
MessageBox.Show("External data source XML: " & _
   myNavigator.OuterXml.ToString())

Wenn Sie Zugriff auf ein XPathNavigator-Objekt am Stamm der externen Datenquelle erhalten haben, können Sie mithilfe von Members der XPathNavigator-Klasse wie den Methoden SelectSingleNode und SetValue mit den enthaltenen Daten arbeiten.

InfoPath-Objektmodellmember, von denen die Klassen "XPathNavigator" und "XPathNodeIterator" verwendet werden

Die folgende Tabelle enthält eine Übersicht aller Member des Microsoft.Office.InfoPath-Namespace, von denen die XPathNavigator-Klasse verwendet wird, um auf XML-Daten zuzugreifen, sie zu bearbeiten oder zu senden.

Übergeordnete Klasse

Member

AdoQueryConnection

BuildSqlFromXmlNodes-Methode

AdoSubmitConnection

BuildSqlFromXmlNodes-Methode

ClickedEventArgs

Source-Eigenschaft

ContextChangedEventArgs

Context-Eigenschaft

DataSource

CreateNavigator-Methode

GetNamedNodeProperty-Methode

SetNamedNodeProperty-Methode

EmailSubmitConnection

Execute-Methode

FileQueryConnection

Execute-Methode

FileSubmitConnection

Execute-Methode

FormError

Site-Eigenschaft

FormErrorCollection

Add-Methoden

FormTemplate

Manifest-Eigenschaft

MergeEventArgs

Xml-Eigenschaft

SharepointListQueryConnection

Execute-Methode

Signature

SignatureBlockXmlNode-Eigenschaft

SignedDataBlock

SignatureContainer-Eigenschaft

View

GetContextNodes-Methoden

SelectNodes-Methoden

SelectText-Methoden

WebServiceConnection

Execute-Methode

GenerateDataSetDiffGram-Methode

XmlEventArgs

OldParent-Eigenschaft

Site-Eigenschaft

XmlForm

MainDataSource-Eigenschaft, die ein DataSource-Objekt zurückgibt, das wiederum die CreateNavigator-Methode zum Erstellen eines XPathNavigator-Objekts am Stamm des dem Formular zugrunde liegenden XML-Dokuments (Hauptdatenquelle) bereitstellt.

MergeForm-Methode

XmlFormCollection

NewFromFormTemplate-Methode

XmlValidatingEventArgs

ReportError-Methoden

Neben den InfoPath-Objektmodellmembern, die ein XPathNavigator-Objekt zurückgeben oder annehmen, geben die folgenden Methoden eine Instanz der XPathNodeIterator-Klasse des System.Xml.XPath-Namespace zum Durchlaufen der XML-Knoten von Elementen zurück, die in einer Ansicht angegeben oder ausgewählt werden.

Übergeordnete Klasse

Member

View

GetContextNodes-Methoden

GetSelectedNodes-Methode

Verwenden der Klassen "XPathNavigator" und "XPathNodeIterator" für in einer Ansicht ausgewählte Daten

Im folgenden Beispiel werden Member der Klassen XPathNavigator und XPathNodeIterator für Formulardaten in der folgenden Reihenfolge verwendet:

  1. Die CreateNavigator-Methode der DataSource-Klasse dient zum Erstellen einer XPathNavigator-Objektvariablen mit dem Namen repeatingTableRow1, die sich standardmäßig am Stamm des dem Formular zugrunde liegenden XML-Dokuments (der Hauptdatenquelle) befindet.

  2. Die SelectSingleNode-Methode der XPathNavigator-Klasse dient zum Verschieben der Position des XPathNavigator-Objekts in die erste Zeile des Steuerelements Wiederholte Tabelle, das an group2 in der Datenquelle gebunden ist.

  3. Die repeatingTableRow1-Objektvariable wird an die SelectNodes-Methode der View-Klasse übergeben, um die Knoten in dieser Zeile auszuwählen.

  4. Eine XPathNodeIterator-Objektvariable mit dem Namen selectedNodes wird deklariert, und die GetSelectedNodes-Methode der View-Klasse wird verwendet, um das XPathNodeIterator-Objekt mit den ausgewählten Knoten aufzufüllen.

  5. Die Count-Eigenschaft der XPathNodeIterator-Klasse dient zum Anzeigen der Anzahl der Knoten, die in der selectedNodes-Objektvariablen enthalten sind.

  6. Eine For/Each-Schleife dient zum Durchlaufen der Knoten in der selectedNodes-Objektvariablen und zum Anzeigen von Informationen zu den einzelnen Knoten mithilfe der Eigenschaften Name, InnerXml und Value der XPathNavigator-Klasse.

// Create XPathNavigator and specify XPath for nodes.
XPathNavigator repeatingTableRow1 = 
   this.CreateNavigator().SelectSingleNode(
   "/my:myFields/my:group1/my:group2[1]", NamespaceManager);

// Select nodes in specified XPathNavigator.
CurrentView.SelectNodes(repeatingTableRow1);

// Get selected nodes.
XPathNodeIterator selectedNodes = 
   CurrentView.GetSelectedNodes();

// Display the count of selected nodes.
MessageBox.Show(selectedNodes.Count.ToString());

// Loop through collection and display information.
foreach (XPathNavigator selectedNode in selectedNodes)
{
   MessageBox.Show(selectedNode.Name);
   MessageBox.Show(selectedNode.InnerXml);
   MessageBox.Show(selectedNode.Value);
}
' Create XPathNavigator and specify XPath for nodes.
Dim repeatingTableRow1 As XPathNavigator  = _
   Me.CreateNavigator().SelectSingleNode( _
   "/my:myFields/my:group1/my:group2[1]", NamespaceManager)

' Select nodes in specified XPathNavigator.
CurrentView.SelectNodes(repeatingTableRow1)

' Get selected nodes.
Dim selectedNodes As XPathNodeIterator = _
   CurrentView.GetSelectedNodes()

' Display the count of selected nodes.
MessageBox.Show(selectedNodes.Count.ToString())

' Loop through collection and display information.
Dim selectedNode As XPathNavigator
For Each selectedNode In selectedNodes
   MessageBox.Show(selectedNode.Name)
   MessageBox.Show(selectedNode.InnerXml)
   MessageBox.Show(selectedNode.Value)
Next

Weitere Informationen zum Arbeiten mit aus InfoPath-Formularvorlagen stammenden XML-Daten finden Sie unter Arbeiten mit XML-Daten unter Verwendung der "XPathNavigator"-Klasse in InfoPath 2007-Formularvorlagen.