Importing data or schema from an XML workspace document
Importing an XML workspace document into an existing geodatabase is a four-step process. First, the target workspace must be opened. Second, name mappings must be generated based on the workspace document and the target workspace. Third, name mappings must be checked for conflicts, and if they exist, they have to be resolved. Finally, the export process can begin, using the workspace document, the target workspace, and the name mappings.
- Open the target workspace. See the following code example:
// Open the target file geodatabase and create a name object for it.
Type factoryType = Type.GetTypeFromProgID(
"esriDataSourcesGDB.FileGDBWorkspaceFactory");
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance
(factoryType);
IWorkspace workspace = workspaceFactory.OpenFromFile(fileGdbPath, 0);
IDataset workspaceDataset = (IDataset)workspace;
IName workspaceName = workspaceDataset.FullName;
[VB.NET]
' Open the target file geodatabase and create a name object for it.
Dim factoryType As Type = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory")
Dim workspaceFactory As IWorkspaceFactory = CType(Activator.CreateInstance(factoryType), IWorkspaceFactory)
Dim workspace As IWorkspace = workspaceFactory.OpenFromFile(fileGdbPath, 0)
Dim workspaceDataset As IDataset = CType(workspace, IDataset)
Dim workspaceName As IName = workspaceDataset.FullName
- The GdbImporter class, which implements the IGdbXmlImport interface, can be used to generate an enumerator of name mappings, given the open workspace and the path to the XML workspace document. The name mappings are generated using the schema section of the workspace document. See the following code example:
// Create a GdbImporter and use it to generate name mappings.
IGdbXmlImport gdbXmlImport = new GdbImporterClass();
IEnumNameMapping enumNameMapping = null;
Boolean conflictsFound = gdbXmlImport.GenerateNameMapping(workspaceDocPath,
workspace, out enumNameMapping);
[VB.NET]
' Create a GdbImporter and use it to generate name mappings.
Dim gdbXmlImport As IGdbXmlImport = New GdbImporter()
Dim enumNameMapping As IEnumNameMapping = Nothing
Dim conflictsFound As Boolean = gdbXmlImport.GenerateNameMapping(workspaceDocPath, workspace, enumNameMapping)
- Some of the datasets in the workspace document might have names that conflict with existing datasets in the geodatabase. Each name mapping, along with its child name mappings (if applicable), should be checked for conflicts and if a conflict exists, it should be resolved. Attempting to import a workspace document with unresolved conflicts will cause the process to fail.
To detect conflicts, first check the return value of GenerateNameMapping, and if it is true, iterate through the name mappings in the generated name mapping enumerator. For each name mapping, check the INameMapping.NameConflicts property, and if it returns true, set the INameMapping.TargetName property to a new value. Generate the new name using the INameMapping.GetSuggestedName method, but it can be set to any valid name that is not already taken.
Some name mappings have child name mappings, such as feature datasets. These children must also be checked for conflicts. The following code example shows how to use the INameMapping.Children property to access these name mappings.
In some cases, modifying the name mappings might be desired, even if no conflicts exist. For example, modifying the name mappings could be used to append a suffix or prefix onto all objects from the workspace document to "flag" them as imported (that is, MyTable could become MyTable_imp). Name mappings can also be used to change a dataset's configuration keyword. For more information on these options, see, Copying and pasting geodatabase datasets.
// Check for conflicts.
if (conflictsFound)
{
// Iterate through each name mapping.
INameMapping nameMapping = null;
enumNameMapping.Reset();
while ((nameMapping = enumNameMapping.Next()) != null)
{
// Resolve the mapping's conflict (if there is one).
if (nameMapping.NameConflicts)
{
nameMapping.TargetName = nameMapping.GetSuggestedName(workspaceName);
}
// See if the mapping's children have conflicts.
IEnumNameMapping childEnumNameMapping = nameMapping.Children;
if (childEnumNameMapping != null)
{
childEnumNameMapping.Reset();
// Iterate through each child mapping.
INameMapping childNameMapping = null;
while ((childNameMapping = childEnumNameMapping.Next()) != null)
{
if (childNameMapping.NameConflicts)
{
childNameMapping.TargetName = nameMapping.GetSuggestedName
(workspaceName);
}
}
}
}
}
[VB.NET]
' Check for conflicts.
If conflictsFound Then
' Iterate through each name mapping.
enumNameMapping.Reset()
Dim nameMapping As INameMapping = enumNameMapping.Next()
While Not nameMapping Is Nothing
' Resolve the mapping's conflict (if there is one).
If nameMapping.NameConflicts Then
nameMapping.TargetName = nameMapping.GetSuggestedName(workspaceName)
End If
' See if the mapping's children have conflicts.
Dim childEnumNameMapping As IEnumNameMapping = nameMapping.Children
If Not childEnumNameMapping Is Nothing Then
childEnumNameMapping.Reset()
' Iterate through each child mapping.
Dim childNameMapping As INameMapping = childEnumNameMapping.Next()
While Not childNameMapping Is Nothing
If childNameMapping.NameConflicts Then
childNameMapping.TargetName = childNameMapping.GetSuggestedName(workspaceName)
End If
childNameMapping = childEnumNameMapping.Next()
End While
End If
nameMapping = enumNameMapping.Next()
End While
End If
- With the name mapping generated and all conflicts resolved, the import process can begin. The final parameter of IGdbXmlImport.ImportWorkspace—schemaOnly—can be used to specify if only the schema should be imported, or both the schema and the data should be imported. In this example, a value of "false" is used, indicating that both schema and data will be imported. See the following code example:
// Import the workspace document, including both schema and data.
gdbXmlImport.ImportWorkspace(workspaceDocPath, enumNameMapping, workspace, false);
[VB.NET]
' Import the workspace document, including both schema and data.
gdbXmlImport.ImportWorkspace(workspaceDocPath, enumNameMapping, workspace, False)
Complete code example
The following is the complete code example of importing an XML workspace document into a geodatabase:
[C#]
private void ImportXmlWorkspaceDocument(String fileGdbPath, String workspaceDocPath)
{
// Open the target file geodatabase and create a name object for it.
Type factoryType = Type.GetTypeFromProgID(
"esriDataSourcesGDB.FileGDBWorkspaceFactory");
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance
(factoryType);
IWorkspace workspace = workspaceFactory.OpenFromFile(fileGdbPath, 0);
IDataset workspaceDataset = (IDataset)workspace;
IName workspaceName = workspaceDataset.FullName;
// Create a GdbImporter and use it to generate name mappings.
IGdbXmlImport gdbXmlImport = new GdbImporterClass();
IEnumNameMapping enumNameMapping = null;
Boolean conflictsFound = gdbXmlImport.GenerateNameMapping(workspaceDocPath,
workspace, out enumNameMapping);
// Check for conflicts.
if (conflictsFound)
{
// Iterate through each name mapping.
INameMapping nameMapping = null;
enumNameMapping.Reset();
while ((nameMapping = enumNameMapping.Next()) != null)
{
// Resolve the mapping's conflict (if there is one).
if (nameMapping.NameConflicts)
{
nameMapping.TargetName = nameMapping.GetSuggestedName(workspaceName);
}
// See if the mapping's children have conflicts.
IEnumNameMapping childEnumNameMapping = nameMapping.Children;
if (childEnumNameMapping != null)
{
childEnumNameMapping.Reset();
// Iterate through each child mapping.
INameMapping childNameMapping = null;
while ((childNameMapping = childEnumNameMapping.Next()) != null)
{
if (childNameMapping.NameConflicts)
{
childNameMapping.TargetName =
childNameMapping.GetSuggestedName(workspaceName);
}
}
}
}
}
// Import the workspace document, including both schema and data.
gdbXmlImport.ImportWorkspace(workspaceDocPath, enumNameMapping, workspace, false)
;
}
[VB.NET]
Private Sub ImportXmlWorkspaceDocument(ByVal fileGdbPath As String, ByVal workspaceDocPath As String)
' Open the target file geodatabase and create a name object for it.
Dim factoryType As Type = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory")
Dim workspaceFactory As IWorkspaceFactory = CType(Activator.CreateInstance(factoryType), IWorkspaceFactory)
Dim workspace As IWorkspace = workspaceFactory.OpenFromFile(fileGdbPath, 0)
Dim workspaceDataset As IDataset = CType(workspace, IDataset)
Dim workspaceName As IName = workspaceDataset.FullName
' Create a GdbImporter and use it to generate name mappings.
Dim gdbXmlImport As IGdbXmlImport = New GdbImporter()
Dim enumNameMapping As IEnumNameMapping = Nothing
Dim conflictsFound As Boolean = gdbXmlImport.GenerateNameMapping(workspaceDocPath, workspace, enumNameMapping)
' Check for conflicts.
If conflictsFound Then
' Iterate through each name mapping.
enumNameMapping.Reset()
Dim nameMapping As INameMapping = enumNameMapping.Next()
While Not nameMapping Is Nothing
' Resolve the mapping's conflict (if there is one).
If nameMapping.NameConflicts Then
nameMapping.TargetName = nameMapping.GetSuggestedName(workspaceName)
End If
' See if the mapping's children have conflicts.
Dim childEnumNameMapping As IEnumNameMapping = nameMapping.Children
If Not childEnumNameMapping Is Nothing Then
childEnumNameMapping.Reset()
' Iterate through each child mapping.
Dim childNameMapping As INameMapping = childEnumNameMapping.Next()
While Not childNameMapping Is Nothing
If childNameMapping.NameConflicts Then
childNameMapping.TargetName = childNameMapping.GetSuggestedName(workspaceName)
End If
childNameMapping = childEnumNameMapping.Next()
End While
End If
nameMapping = enumNameMapping.Next()
End While
End If
' Import the workspace document, including both schema and data.
gdbXmlImport.ImportWorkspace(workspaceDocPath, enumNameMapping, workspace, False)
End Sub
To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):
ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)ESRI.ArcGIS.Geodatabase ESRI.ArcGIS.GeoDatabaseDistributed
Development licensing | Deployment licensing |
---|---|
ArcGIS for Desktop Standard | ArcGIS for Desktop Standard |
ArcGIS for Desktop Advanced | ArcGIS for Desktop Advanced |
Engine Developer Kit | Engine: Geodatabase Update |