Поделиться через


Практическое руководство. Работа с классами XPathNavigator и XPathNodeIterator

Для получения доступа к XML-данным, расположенным в источниках данных шаблона формы, а также для управления этими XML-данными доступен широкий спектр элементов объектной модели с управляемым кодом, которые предоставляются пространством имен Microsoft.Office.InfoPath и могут быть созданы или переданы экземпляром класса XPathNavigator пространства имен System.Xml.XPath. После получения доступа к объекту XPathNavigator, возвращенному элементом объектной модели InfoPath, можно использовать свойства и методы класса XPathNavigator для работы с данными.

Наиболее часто используемый элемент пространства имен Microsoft.Office.InfoPath, который применяет класс XPathNavigator, - это метод CreateNavigator класса DataSource, позволяющий работать с сохраненными данными, предоставленными объектом DataSource. Метод CreateNavigator создает объект XPathNavigator, располагающийся в корне источника данных, представленного объектом DataSource.

ЗаметкаЗаметка

При наличии знаний по использованию MSXML5 из сценария для работы с данными в Microsoft InfoPath 2003 можно рассмотреть вариант применения метода CreateNavigator в качестве замены свойства DOM для DataObject.

Например, в следующем примере кода описано создание объекта XPathNavigator, расположенного в корне источника данных "CityList", с помощью метода CreateNavigator с последующим использованием свойства OuterXml класса XPathNavigator для отображения XML-данных, возвращаемых в окне сообщения.

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

Элементы объектной модели InfoPath, использующие классы XPathNavigator и XPathNodeIterator

В следующей таблице приведены обобщенные сведения обо всех элементах пространства имен Microsoft.Office.InfoPath, использующего класс XPathNavigator для доступа к XML-данным, управления ими и отправки их.

Родительский класс Элемент

AdoQueryConnection

Метод BuildSqlFromXmlNodes

AdoSubmitConnection

BuildSqlFromXmlNodesM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

ClickedEventArgs

Свойство Source

ContextChangedEventArgs

ContextP:Microsoft.Office.InfoPath.FormError.Site

DataSource

CreateNavigatorM:Microsoft.Office.InfoPath.FormErrorCollection.DeleteAll

GetNamedNodePropertyM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

SetNamedNodePropertyM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

EmailSubmitConnection

ExecuteM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

FileQueryConnection

ExecuteM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

FileSubmitConnection

ExecuteM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

FormError

Свойство Site

FormErrorCollection

Методы Add

FormTemplate

ManifestP:Microsoft.Office.InfoPath.FormError.Site

MergeEventArgs

XmlP:Microsoft.Office.InfoPath.ClickedEventArgs.Source

SharepointListQueryConnection

ExecuteM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

Signature

SignatureBlockXmlNodeP:Microsoft.Office.InfoPath.FormError.Site

SignedDataBlock

SignatureContainerP:Microsoft.Office.InfoPath.Window.WindowState

View

GetContextNodesM:Microsoft.Office.InfoPath.FormErrorCollection.Add(System.Xml.XPath.XPathNavigator,System.String,System.String)

SelectNodesM:Microsoft.Office.InfoPath.FormErrorCollection.Add(System.Xml.XPath.XPathNavigator,System.String,System.String)

SelectTextM:Microsoft.Office.InfoPath.FormErrorCollection.Add(System.Xml.XPath.XPathNavigator,System.String,System.String)

WebServiceConnection

ExecuteM:Microsoft.Office.InfoPath.UserPermissionCollection.Remove(System.String)

GenerateDataSetDiffGramM:Microsoft.Office.InfoPath.Window.Activate

XmlEventArgs

OldParentP:Microsoft.Office.InfoPath.ClickedEventArgs.Source

SiteP:Microsoft.Office.InfoPath.ClickedEventArgs.Source

XmlForm

Свойство MainDataSource, возвращающее объект DataSource, который, в свою очередь, предоставляет метод CreateNavigator для создания объекта XPathNavigator, расположенного в корне базового XML-документа формы (основного источника данных).

MergeFormM:Microsoft.Office.InfoPath.AdoQueryConnection.BuildSqlFromXmlNodes(System.Xml.XPath.XPathNavigator)

XmlFormCollection

NewFromFormTemplateM:Microsoft.Office.InfoPath.UserPermissionCollection.Remove(System.String)

XmlValidatingEventArgs

ReportErrorM:Microsoft.Office.InfoPath.FormErrorCollection.Add(System.Xml.XPath.XPathNavigator,System.String,System.String)

В дополнение к элементам объектной модели InfoPath, возвращающим или принимающим объект XPathNavigator, следующие методы возвращают экземпляр класса XPathNodeIterator пространства имен System.Xml.XPath для прохода по XML-узлам элементов, указанных или выбранных в представлении.

Родительский класс Элемент

View

GetContextNodesM:Microsoft.Office.InfoPath.FormErrorCollection.Add(System.Xml.XPath.XPathNavigator,System.String,System.String)

GetSelectedNodesM:Microsoft.Office.InfoPath.Window.Activate

Сведения о свойствах и методах классов XPathNavigator и XPathNodeIterator см. в справочной документации .NET Framework.

Использование классов XPathNavigator и XPathNodeIterator для работы с данными, выбранными в представлении

В следующем примере используются элементы обоих классов XPathNavigator и XPathNodeIterator для работы с данными форм в следующей последовательности:

  1. Метод CreateNavigator класса DataSource используется для создания объектной переменной XPathNavigator с именем repeatingTableRow1, которая по умолчанию располагается в корне базового XML-документа формы (основного источника данных).

  2. Метод SelectSingleNode класса XPathNavigator используется для смещения позиции объекта XPathNavigator в первую строку элемента управления Повторяющаяся таблица, связанного с группой group2 в источнике данных.

  3. Объектная переменная repeatingTableRow1 передается методу SelectNodes класса View для выбора узлов в этой строке.

  4. Объявляется объектная переменная XPathNodeIterator с именем selectedNodes и используется метод GetSelectedNodes класса View для заполнения объекта XPathNodeIterator выбранными узлами.

  5. Свойство Count класса XPathNodeIterator используется для отображения количества узлов, содержащихся в объектной переменной selectedNodes.

  6. Цикл For/Each используется для прохода по узлам объектной переменной selectedNodes и отображения сведений о каждом узле с помощью свойств Name, InnerXml и Value класса XPathNavigator.

// Create XPathNavigator and specify XPath for nodes.
XPathNavigator repeatingTableRow1 = 
   MainDataSource.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  = _
   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