방법: XPathNavigator 및 XPathNodeIterator 클래스 사용
양식 서식 파일 데이터 원본의 XML 데이터에 액세스하여 조작하기 위해 Microsoft.Office.InfoPath 네임스페이스에서 제공하는 관리 코드 개체 모델의 많은 멤버는 System.Xml.XPath 네임스페이스의 XPathNavigator 클래스 인스턴스를 만들거나 전달 받을 수 있습니다. InfoPath 개체 모델 멤버에 의해 반환된 XPathNavigator 개체에 액세스할 수 있는 경우 XPathNavigator 클래스의 속성과 메서드를 사용하여 데이터 작업을 수행할 수 있습니다.
XPathNavigator 클래스를 이용하는 Microsoft.Office.InfoPath 네임스페이스에서 가장 자주 사용하는 멤버는 DataSource 클래스의 CreateNavigator 메서드입니다. 이 메서드를 사용하면 DataSource 개체가 나타내는 저장된 데이터를 사용할 수 있습니다. CreateNavigator 메서드는 DataSource 개체가 나타내는 데이터 원본의 루트에 있는 XPathNavigator 개체를 만듭니다.
팁
스크립트에서 MSXML5를 사용하여 Microsoft InfoPath 2003의 데이터 작업을 수행하는 데 익숙하면 CreateNavigator 메서드를 DataObject의 DOM 속성 대신 사용할 수 있습니다.
XPathNavigator 클래스를 사용하여 양식의 기본 데이터 원본에 액세스
양식의 기본 데이터 원본에 액세스하려면 this(C#) 또는 Me(Visual Basic) 키워드에서 CreateNavigator 메서드를 직접 호출하십시오. 다음 예제에서는 CreateNavigator 메서드를 사용하여 기본 데이터 원본의 루트에 있는 XPathNavigator 개체를 만든 다음 XPathNavigator 클래스의 OuterXml 속성을 사용하여 메시지 상자에 반환된 XML을 표시합니다.
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())
참고 사항 |
---|
this 또는 Me 키워드에서 직접 CreateNavigator메서드를 호출하는 것은 MainDataSource 속성을 사용하거나(this.MainDataSource.CreateNavigator()) XmlForm 클래스의 DataSources 속성에 빈 문자열을 전달하여(this.DataSources[""].CreateNavigator()) CreateNavigator 메서드를 호출하는 것과 같습니다. |
기본 데이터 원본의 필드에 대한 XML 노드 선택 및 설정
데이터 원본의 필드에 대한 단일 XML 노드를 선택하려면 XPathNavigator 클래스의 SelectSingleNode(String,IXmlNamespaceResolver) 메서드를 사용합니다. 반복 필드 또는 반복 그룹에 대해 작업하려면 XPathNavigator 클래스의 Select(String,IXmlNamespaceResolver) 메서드를 사용합니다. 이 메서드는 노드의 컬렉션을 나타내는 XPathNodeIterator 개체를 반환합니다.
단일 노드 값 선택 및 설정
사용해야 하는 오버로드된 SelectSingleNode 메서드에는 XPath 식을 문자열로 취하는 xpath 매개 변수와 네임스페이스 접두사를 확인하는 XmlNamespaceManager 개체를 취하는 resolver 매개 변수가 있습니다. 양식의 기본 데이터 원본에서 단일 노드를 선택하려면 xpath 매개 변수에 대해 선택할 필드 또는 그룹을 지정하는 XPath 식을, XmlForm 개체의 NamespaceManager 속성으로 반환되는 XmlNamespaceManager 개체와 함께 제공해야 합니다. 반환되는 XmlNamespaceManager 개체는 양식 서식 파일의 양식 정의 파일(.xsf)에 정의된 모든 네임스페이스와 함께 로드 시 초기화됩니다.
팁
양식의 데이터 원본에서 노드를 선택하는 XPath 식을 가장 쉽게 만드는 방법은 필드 작업 창에서 필드 또는 그룹을 마우스 오른쪽 단추로 클릭한 다음 XPath 복사를 클릭하는 것입니다. 중첩 수준이 복잡하거나 많은 XML 스키마의 노드에 액세스하는 XPath 식을 직접 만들어 테스트하려면 양식에 식 상자 컨트롤을 추가하고, 컨트롤의 XPath 식을 지정한 다음 양식을 미리 보고 결과를 표시하면 됩니다.
다음 예제에서는 SelectSingleNode 메서드를 사용하여 EmailAlias 필드의 단일 노드를 선택합니다. 그런 다음 XPathNavigator 클래스의 SetValue 메서드 및 User 클래스의 UserName 속성을 사용하여 필드의 값을 현재 사용자 별칭으로 설정합니다.
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())
XPath 식을 만드는 방법에 대한 자세한 내용은 MSDN의 XPath 참조서(영문일 수 있음) 및 XML 경로 언어(XPath) 버전 1.0 W3C 권장 사항 (영문일 수 있음)을 참조하십시오.
xsi:nil 특성이 있는 노드 값 설정
특정 데이터 형식의 경우 빈 필드의 값을 설정하려고 하면 프로그래밍상으로 "스키마 유효성 검사에서 데이터 형식 오류가 아닌 다른 오류 발견되었습니다."라는 오류가 발생합니다. 일반적으로 이 오류의 원인은 요소의 xsi:nil (영문일 수 있음) 특성이 true로 설정되었기 때문입니다. 양식의 빈 필드에 대한 기본 XML 요소를 살펴보면 이러한 설정을 확인할 수 있습니다. 예를 들어 다음 빈 데이터 필드의 XML 부분에서 xsi:nil 특성이 true로 설정되어 있습니다.
<my:myDate xsi:nil="true"></my:myDate>
xsi:nil 특성이 true로 설정되면 요소는 나타나지만 값은 없습니다. 즉, null이 됩니다. 프로그래밍상으로 이러한 노드 값을 설정하려고 하면 요소가 현재 null인 것으로 플래그 지정되어 InfoPath에 "스키마 유효성 검사에서 데이터 형식 오류가 아닌 다른 오류 발견되었습니다." 메시지가 표시됩니다. InfoPath에서는 다음 데이터 형식의 null 필드에 대해 xsi:nil 특성을 true로 설정합니다.
Whole Number (integer)
Decimal (double)
Date (date)
Time (time)
Date and Time (dateTime)
이 오류를 방지하려면 코드에서 xsi:nil 특성을 테스트해야 하며, 오류가 있으면 노드의 값을 설정하기 전에 제거해야 합니다. 다음 서브루틴은 사용자가 설정하려는 노드에 있는 XpathNavigator 개체를 취해서 nil 특성을 확인한 다음 오류가 있는 경우 해당 오류를 삭제합니다.
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
날짜 필드를 설정하는 다음 예제와 같이 xsi:nil 특성을 가질 수 있는 데이터 형식의 필드를 설정하기 전에 이 서브루틴을 호출할 수 있습니다.
// 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)
참고 사항 |
---|
InfoPath에서 XPathNavigator 개체를 구현하면 SetTypedValue 메서드가 표시됩니다. 이 메서드는 특정 형식의 값을 사용하여 노드를 설정하는 데 사용되며, InfoPath에서 따로 구현하지는 않습니다. 따라서 사용자가 SetValue 메서드를 대신 사용하고, 노드 데이터 형식에 대해 올바른 형식의 문자열 값을 전달해야 합니다. |
반복 노드 집합 선택 및 설정
확정되지 않은 수의 반복 필드 또는 그룹 집합을 지정하려면 XPathNavigator 클래스의 Select 메서드를 사용해야 합니다. 이 메서드는 지정된 노드 컬렉션에 대해 반복하여 사용할 수 있는 XPathNodeIterator 개체를 반환합니다.
다음 예제에서는 양식 서식 파일에 글머리 기호 목록이나 field1이라는 반복 요소에 바인딩된 비슷한 반복 컨트롤이 포함되어 있다고 가정합니다. 필드의 XPath는 Select 메서드로 전달되고 반환되는 XPathNodeIterator는 nodes 변수에 지정됩니다. 그런 다음 MoveNext 메서드를 사용하여 노드 컬렉션에 대해 반복하고, Current 속성을 사용하여 현재 노드에 있는 XPathNavigator 개체를 반환합니다. 마지막으로 Value 속성을 사용하여 각 반복 필드의 값을 검색하고 표시합니다.
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)
위의 예제는 지정된 반복 필드의 문자열 값을 사용하여 작업합니다. 그러나 필드에 숫자 값이 있으면 비슷한 코드를 사용하여 필드의 값을 반복 사용하여 합계나 값의 평균 계산과 같은 연산을 수행할 수 있습니다.
마찬가지로 Value 속성을 사용하여 반복 필드의 각 인스턴스 값을 가져오는 대신 다음 예제와 같이 SetValue 메서드를 사용하여 필드를 반복하고 값을 설정할 수 있습니다.
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
XPathNavigator 클래스를 사용하여 외부 데이터 원본에 액세스
양식과 연결된 외부 데이터 원본에 액세스하려면 XmlForm 클래스의 DataSources 속성에 데이터 원본의 이름을 전달하면 됩니다. 다음 외부 데이터 원본에 대한 연결을 만들거나 기존 외부 데이터 원본 연결의 이름 목록을 보려면 리본 메뉴의 데이터 탭에서 데이터 연결을 클릭하십시오.
다음 코드 예제에서는 CreateNavigator 메서드를 사용하여 "CityList"라는 외부 데이터 원본의 루트에 있는 XPathNavigator 개체를 만든 다음 XPathNavigator 클래스의 OuterXml 속성을 사용하여 반환된 XML을 메시지 상자에 표시하는 방법을 보여 줍니다. 이 코드 예제에서는 외부 데이터 원본(예: XML 문서 또는 SharePoint 목록)에 저장된 도시 이름 목록에 대한 데이터 연결을 만들고 데이터 연결 이름을 ""CityList"로 지정했다고 가정합니다.
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())
외부 데이터 원본에 있는 XPathNavigator 개체에 대한 액세스 권한이 있으면 XPathNavigator 클래스의 멤버(예: SelectSingleNode 및 SetValue 메서드)를 사용하여 해당 멤버가 포함된 데이터에 대한 작업을 수행할 수 있습니다.
XPathNavigator 및 XPathNodeIterator 클래스를 사용하는 InfoPath 개체 모델 멤버
다음 표에서는 XPathNavigator 클래스를 사용하여 XML 데이터에 액세스, 조작 또는 전송하는 Microsoft.Office.InfoPath 네임스페이스의 모든 멤버에 대한 요약을 보여 줍니다.
부모 클래스 |
멤버 |
---|---|
Source 속성 |
|
Context 속성 |
|
CreateNavigator 메서드 |
|
Execute 메서드 |
|
Execute 메서드 |
|
Execute 메서드 |
|
Site 속성 |
|
Add 메서드 |
|
Manifest 속성 |
|
Xml 속성 |
|
Execute 메서드 |
|
GetContextNodes 메서드 |
|
SelectNodes 메서드 |
|
SelectText 메서드 |
|
Execute 메서드 |
|
OldParent 속성 |
|
Site 속성 |
|
DataSource 개체를 반환하는 MainDataSource 속성. 이 개체는 다시 양식의 원본으로 사용하는 XML 문서(주 데이터 원본)의 루트에 있는 XPathNavigator 개체를 만들기 위한 CreateNavigator 메서드를 제공합니다. |
|
MergeForm 메서드 |
|
ReportError 메서드 |
XPathNavigator 개체를 반환하거나 허용하는 InfoPath 개체 모델 멤버 외에도 다음 메서드는 보기에서 지정하거나 선택한 항목의 XML 노드에 대해 반복하는 데 사용되는 System.Xml.XPath 네임스페이스의 XPathNodeIterator 클래스 인스턴스를 반환합니다.
부모 클래스 |
멤버 |
---|---|
GetContextNodes 메서드 |
|
GetSelectedNodes 메서드 |
XPathNavigator 및 XPathNodeIterator 클래스를 사용하여 보기에서 선택한 데이터 작업
다음 예제에서는 XPathNavigator 및 XPathNodeIterator 클래스의 멤버를 사용하여 다음 시퀀스로 양식 데이터 작업을 수행합니다.
DataSource 클래스의 CreateNavigator 메서드를 사용하여 기본적으로 양식의 원본으로 사용하는 XML 문서(주 데이터 원본)의 루트에 있는 repeatingTableRow1이라는 XPathNavigator 개체 변수를 만듭니다.
XPathNavigator 클래스의 SelectSingleNode 메서드를 사용하여 XPathNavigator 개체의 위치를 데이터 원본의 group2에 바인딩된 반복 표 컨트롤의 첫 번째 행으로 이동합니다.
repeatingTableRow1 개체 변수를 View 클래스의 SelectNodes 메서드로 전달하여 해당 행의 노드를 선택합니다.
selectedNodes라는 XPathNodeIterator 개체 변수를 선언하고 View 클래스의 GetSelectedNodes 메서드를 사용하여 XPathNodeIterator 개체에 선택한 노드를 채웁니다.
XPathNodeIterator 클래스의 Count 속성을 사용하여 selectedNodes 개체 변수에 포함된 노드 수를 표시합니다.
For/Each 루프를 사용하여 selectedNodes 개체 변수의 노드에 대해 반복하고 XPathNavigator 클래스의 Name, InnerXml 및 Value 속성을 사용하여 각 노드에 대한 정보를 표시합니다.
// 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
InfoPath 양식 서식 파일의 XML 데이터를 사용하는 방법에 대한 자세한 내용은 InfoPath 2007 양식 서식 파일의 XPathNavigator 클래스를 사용하여 XML 데이터 작업(영문일 수 있음)을 참조하십시오.