Skip to content

Client-only Metadata Definition

To generate a metadata file that contains client-only entities, the first step is to fetch the metadata XML document from the back end, then edit the XML document to import the offline vocabulary, and add client-only models into the metadata. The client-only models need to be annotated with the terms defined in the offline vocabulary.

Get The Metadata From OData Server

The metadata XML can be fetched using the mobile service https://serviceroot/$metadata serviceroot URL, and the user may also fetch the metadata from the OData server if they have direct access to it.

Import Offline Vocabulary

By convention, the com.sap.vocabularies.Offline.v1 namespace has the alias, Offline.

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
    <edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Offline.xml">
        <edmx:Include Alias="Offline" Namespace="com.sap.vocabularies.Offline.v1" />
    </edmx:Reference>
</edmx:Edmx>

Add Client-only Models

The following kinds of client-only models are currently supported:

  • EnumType

  • ComplextType

  • EntityType

  • EntitySet

Add Client-only EnumType

<Schema Namespace="Sample">
<EnumType IsFlags="false" Name="Hobby" UnderlyingType="Edm.Int64">
    <Annotation Term="Offline.ClientOnly" />
    <Member Name="sport" Value="1" />
    <Member Name="travel" Value="2" />
    ...
</EnumType>
</Schema>

Note

Because the enum type is only supported in OData version 4.0, the OData version in the metadata document must be 4.0 or higher.

Add Client-only ComplexType

<Schema Namespace="ESPM" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<ComplexType Name="Configuration">
    <Annotation Term="Offline.ClientOnly" />
    <Property MaxLength="128" Name="ConfigName" Nullable="true" Type="Edm.String" />
    <Property MaxLength="255" Name="ConfigValue" Nullable="true" Type="Edm.String" />
</ComplexType>
</Schema>

Add Client-only EntityType

<Schema Namespace="ESPM" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityType Name="ConfigItem">
    <Annotation Term="Offline.ClientOnly" />
    <Key>
        <PropertyRef Name="id" />
    </Key>
    <Property Name="id" Nullable="false" Type="Edm.Int32" />
    <Property Name="config" Type="ESPM.Configuration" Nullable="true" />
    <Property MaxLength="256" Name="description" Nullable="true" Type="Edm.String" />
</EntityType>
</Schema>

Add Client-only EntitySet

  • Add a client-only entity set that uses the client-only entity type.

You can define a client-only entity set that references the ConfigItem client-only entity type,

 <EntitySet EntityType="ESPM.ConfigItem" Name="ConfigItems">
    <Annotation Term="Offline.ClientOnly" />
</EntitySet>

Note

If an entity set uses the client-only entity type, then that entity set is treated as client-only. The Offline.ClientOnly annotation is optional for an entity set that uses a client-only entity type.

  • Add the client-only entity set(draft) which uses a backend entity type.

Suppose the entity type TableA is defined in the backend metadata, you can define a client-only entity set that uses the entity type defined in the backend metadata. For this case, the Offline.ClientOnly annotation is mandatory as this is the only way to let offline OData know that the entity set is client-only. To further define the client-only entity set as a draft set, the ActiveEntitySet property of the Offline.LocalDraft record should be correctly defined. The string value of the ActiveEntitySet property should be the name of the entity set defined in the backend metadata that uses the same entity type as the draft set.

<EntitySet EntityType="Sample.TableA" Name="TableADraft">
    <Annotation Term="Offline.ClientOnly">
        <Record Type="Offline.LocalDraft">
            <PropertyValue Property="ActiveEntitySet" String="TableA" />
        </Record>
    </Annotation>
</EntitySet>

Note

The String value of the ActiveEntitySet should be the name of the target entity set.

Add a Relationship Between Client-only Models

Defining a relationship between client-only entities is the same as defining a relationship between back-end entities. However, relationships between client-only entities and back-end entities are not supported. The behavior is undetermined for relationships that navigate from the client-only entity to the back-end entity. Navigation from a backend entity to a client-only entity is not possible, as the client-only metadata is visible only to the client device. The OData back end is not aware of any OData models defined in the client application.

For OData 4.0, the navigation property and navigation property binding should be properly defined for client-only entity types and entity sets. For example:

<EntityType Name="ConfigCategory">
    <Annotation Term="Offline.ClientOnly" />
    <Key>
        <PropertyRef Name="id" />
    </Key>
    <Property Name="id" Nullable="false" Type="Edm.Int32" />
    <Property MaxLength="255" Name="name" Nullable="true" Type="Edm.String" />
    <NavigationProperty Name="configItems" Nullable="true" Partner="category" Type="Collection(ESPM.ConfigItem)">
        <OnDelete Action="Cascade" />
    </NavigationProperty>
</EntityType>

<EntityType Name="ConfigItem">
    <Annotation Term="Offline.ClientOnly" />
    <Key>
        <PropertyRef Name="id" />
    </Key>
    <Property Name="id" Nullable="false" Type="Edm.Int32" />
    <Property MaxLength="255" Name="key" Nullable="true" Type="Edm.String" />
    <Property MaxLength="255" Name="value" Nullable="true" Type="Edm.String" />
    <NavigationProperty Name="category" Nullable="true" Partner="configItems" Type="ESPM.ConfigCategory" />
</EntityType>

<EntitySet Name="ConfigCategories" EntityType="ESPM.ConfigCategory">
    <Annotation Term="Offline.ClientOnly" />
    <NavigationPropertyBinding Path="configItems" Target="ConfigItems" />
</EntitySet>
<EntitySet Name="ConfigItems" EntityType="ESPM.ConfigItem">
    <Annotation Term="Offline.ClientOnly" />
    <NavigationPropertyBinding Path="category" Target="ConfigCategories" />
</EntitySet>

For OData version 2.0, the navigation property, association, and association set should be properly defined for a client-only entity type and entity set. For example:

<EntityType Name="ConfigCategory">
    <Annotation Term="Offline.ClientOnly" />
    <Key>
        <PropertyRef Name="id" />
    </Key>
    <Property Name="id" Nullable="false" Type="Edm.Int32" />
    <Property MaxLength="255" Name="name" Nullable="true" Type="Edm.String" />
    <NavigationProperty Name="configItems" Relationship="ESPM.ConfigCategory_to_ConfigItem" FromRole="ConfigCategory" ToRole="ConfigItem" />
</EntityType>
<EntityType Name="ConfigItem">
    <Annotation Term="Offline.ClientOnly" />
    <Key>
        <PropertyRef Name="id" />
    </Key>
    <Property Name="id" Nullable="false" Type="Edm.Int32" />
    <Property MaxLength="255" Name="key" Nullable="true" Type="Edm.String" />
    <Property MaxLength="255" Name="value" Nullable="true" Type="Edm.String" />
    <NavigationProperty Name="category" Nullable="true" Relationship="ESPM.ConfigCategory_to_ConfigItem" FromRole="ConfigItem" ToRole="ConfigCategory" />
</EntityType>
<Association Name="ConfigCategory_to_ConfigItem">
    <End Type="ESPM.ConfigCategory" Multiplicity="1" Role="ConfigCategory">
        <OnDelete Action="Cascade" />
    </End>
    <End Type="ESPM.ConfigItem" Multiplicity="*" Role="ConfigItem" />
</Association>

<EntitySet Name="ConfigCategories" EntityType="ESPM.ConfigCategory">
    <Annotation Term="Offline.ClientOnly" />
</EntitySet>
<EntitySet Name="ConfigItems" EntityType="ESPM.ConfigItem">
    <Annotation Term="Offline.ClientOnly" />
</EntitySet>
<AssociationSet Name="ConfigCategories_to_ConfigItems" Association="ESPM.ConfigCategory_to_ConfigItem">
    <End EntitySet="ConfigCategories" Role="ConfigCategory" />
    <End EntitySet="ConfigItems" Role="ConfigItem" />
</AssociationSet>

Annotate Client-only Types and Sets

The term ClientOnly can be used to annotate ComplexType, EnumType, EntityType, and EntitySet. The term LocalDraft is used only to annotate an entity set. The ComplexType, EnumType, EntityType and EntitySet extended on the client side must be annotated with the term, ClientOnly. While extending the back-end metadata on the client side, the back-end metadata is not expected to be changed incompatibly. And the new models defined in the client metadata should not conflict with existing models defined in the back-end metadata. Offline OData will never try to upload client-only entities, including local-draft entities. An entity set annotated with the term LocalDraft is called a draft set. Refer to Local Draft for additional details.

Put It All Together

The following is a complete example of a client-only model definition based on the Mobile Sample Service. Beyond the entity types and entity sets defined in the back-end metadata, two client-only entity types, and four client-only entity sets are defined. Two of the client-only entity sets are local-draft entity sets that use the entity types defined in the back-end metadata.

Note

The following example only includes the essential parts relevant for enabling the client-only entity types. However, to create a valid metadata document, you need to include the missing parts from the back-end metadata (for example, ESPM.Address, ESPM.Gender).

Client-only entity types in this example:

  1. ConfigCategory

  2. ConfigItem

Client-only entity sets in this example:

  1. ConfigCategories, use ConfigCategory as the entity type.

  2. ConfigItems, use ConfigItem as the entity type.

  3. DraftCustomers, use Customer as the entity type, and the active entity set is Customers.

  4. DraftSalesOrderHeaders, use SalesOrderHeader as the entity type, and the active entity set is SalesOrderHeaders.

It is possible to navigate from ConfigCategories to ConfigItems or from ConfigItems to ConfigCategories as the relationship is defined.

For OData 4.0, the relationship is defined through the navigation property bindings.

For OData 2.0, the relationship is defined through the associations and association sets.

The relationship between the two draft sets, DraftCustomers and DraftSalesOrderHeaders, is also defined in the example.

Note

Defining client-only entity types and entity sets that have no relationship is supported.

OData 4.0 Example

Example of client-only metadata based on the Mobile Sample Service (OData 4.0):

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
    <edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Offline.xml">
        <edmx:Include Alias="Offline" Namespace="com.sap.vocabularies.Offline.v1" />
    </edmx:Reference>
    <edmx:DataServices>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="ESPM">
            <EntityType Name="Customer">
                <Key>
                    <PropertyRef Name="CustomerID" />
                </Key>
                <Property Name="City" Type="Edm.String" Nullable="true" MaxLength="40" />
                <Property Name="Country" Type="Edm.String" Nullable="true" MaxLength="3" />
                <Property Name="CustomerID" Type="Edm.Int64" Nullable="false" MaxLength="10" />
                <Property Name="DateOfBirth" Type="Edm.Date" Nullable="false" />
                <Property Name="EmailAddress" Type="Edm.String" Nullable="true" MaxLength="255" />
                <Property Name="Gender" Type="ESPM.Gender" Nullable="true" />
                <Property Name="FirstName" Type="Edm.String" Nullable="true" MaxLength="40" />
                <Property Name="HouseNumber" Type="Edm.String" Nullable="true" MaxLength="10" />
                <Property Name="LastName" Type="Edm.String" Nullable="true" MaxLength="40" />
                <Property Name="PhoneNumber" Type="Edm.String" Nullable="true" MaxLength="30" />
                <Property Name="PostalCode" Type="Edm.String" Nullable="true" MaxLength="10" />
                <Property Name="Street" Type="Edm.String" Nullable="true" MaxLength="60" />
                <Property Name="Address" Type="ESPM.Address" Nullable="true" />
                <NavigationProperty Name="SalesOrders" Type="Collection(ESPM.SalesOrderHeader)"
                    Partner="Customer">
                    <OnDelete Action="None" />
                </NavigationProperty>
            </EntityType>
            <EntityType Name="SalesOrderHeader">
                <Key>
                    <PropertyRef Name="SalesOrderID" />
                </Key>
                <Property Name="CreatedAt" Type="Edm.DateTimeOffset" Nullable="true" />
                <Property Name="CurrencyCode" Type="Edm.String" Nullable="true" MaxLength="5" />
                <Property Name="CustomerID" Type="Edm.Int64" Nullable="true" MaxLength="10" />
                <Property Name="GrossAmount" Type="Edm.Decimal" Nullable="true" Precision="15"
                    Scale="3" />
                <Property Name="LifeCycleStatus" Type="Edm.String" Nullable="false" MaxLength="1" />
                <Property Name="LifeCycleStatusName" Type="Edm.String" Nullable="false"
                    MaxLength="255" />
                <Property Name="NetAmount" Type="Edm.Decimal" Nullable="true" Precision="15"
                    Scale="3" />
                <Property Name="SalesOrderID" Type="Edm.Int64" Nullable="false" MaxLength="10" />
                <Property Name="TaxAmount" Type="Edm.Decimal" Nullable="true" Precision="15"
                    Scale="3" />
                <NavigationProperty Name="Customer" Type="ESPM.Customer" Nullable="false"
                    Partner="SalesOrders">
                    <ReferentialConstraint Property="CustomerID" ReferencedProperty="CustomerID" />
                </NavigationProperty>
                <NavigationProperty Name="Items" Type="Collection(ESPM.SalesOrderItem)"
                    Partner="Header">
                    <OnDelete Action="Cascade" />
                </NavigationProperty>
            </EntityType>

            <EntityType Name="ConfigCategory">
                <Annotation Term="Offline.ClientOnly" />
                <Key>
                    <PropertyRef Name="id" />
                </Key>
                <Property Name="id" Nullable="false" Type="Edm.Int32" />
                <Property MaxLength="255" Name="name" Nullable="true" Type="Edm.String" />
                <NavigationProperty Name="configItems" Nullable="true"
                    Partner="category"
                    Type="Collection(ESPM.ConfigItem)">
                    <OnDelete Action="Cascade" />
                </NavigationProperty>
            </EntityType>
            <EntityType Name="ConfigItem">
                <Annotation Term="Offline.ClientOnly" />
                <Key>
                    <PropertyRef Name="id" />
                </Key>
                <Property Name="id" Nullable="false" Type="Edm.Int32" />
                <Property MaxLength="255" Name="key" Nullable="true" Type="Edm.String" />
                <Property MaxLength="255" Name="value" Nullable="true" Type="Edm.String" />
                <NavigationProperty Name="category" Nullable="true"
                    Partner="configItems"
                    Type="ESPM.ConfigCategory">
                </NavigationProperty>
            </EntityType>

            <EntityContainer Name="ESPMContainer">
                <EntitySet Name="Customers" EntityType="ESPM.Customer">
                    <NavigationPropertyBinding Path="SalesOrders" Target="SalesOrderHeaders" />
                </EntitySet>
                <EntitySet Name="SalesOrderHeaders" EntityType="ESPM.SalesOrderHeader">
                    <NavigationPropertyBinding Path="Items" Target="SalesOrderItems" />
                    <NavigationPropertyBinding Path="Customer" Target="Customers" />
                </EntitySet>

                <EntitySet Name="ConfigCategories" EntityType="ESPM.ConfigCategory">
                    <Annotation Term="Offline.ClientOnly" />
                    <NavigationPropertyBinding Path="configItems" Target="ConfigItems" />
                </EntitySet>
                <EntitySet Name="ConfigItems" EntityType="ESPM.ConfigItem">
                    <Annotation Term="Offline.ClientOnly" />
                    <NavigationPropertyBinding Path="category" Target="ConfigCategories" />
                </EntitySet>

                <EntitySet Name="DraftCustomers" EntityType="ESPM.Customer">
                    <Annotation Term="Offline.ClientOnly">
                        <Record Type="Offline.LocalDraft">
                            <PropertyValue Property="ActiveEntitySet" String="Customers" />
                        </Record>
                    </Annotation>
                    <NavigationPropertyBinding Path="SalesOrders" Target="DraftSalesOrderHeaders" />
                </EntitySet>
                <EntitySet Name="DraftSalesOrderHeaders" EntityType="ESPM.SalesOrderHeader">
                    <Annotation Term="Offline.ClientOnly">
                        <Record Type="Offline.LocalDraft">
                            <PropertyValue Property="ActiveEntitySet" String="SalesOrderHeaders" />
                        </Record>
                    </Annotation>
                    <NavigationPropertyBinding Path="Customer" Target="DraftCustomers" />
                </EntitySet>

            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

OData 2.0 Example

Example of client-only metadata based on the Mobile Sample Service (OData 2.0):

<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx"
    xmlns:sap="http://www.sap.com/Protocols/SAPData" Version="1.0">
    <edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Offline.xml">
        <edmx:Include Alias="Offline" Namespace="com.sap.vocabularies.Offline.v1" />
    </edmx:Reference>
    <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
        m:DataServiceVersion="1.0">
        <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="ESPM">
            <EntityType Name="Customer">
                <Key>
                    <PropertyRef Name="CustomerId" />
                </Key>
                <Property Name="City" Type="Edm.String" Nullable="true" MaxLength="40" />
                <Property Name="Country" Type="Edm.String" Nullable="true" MaxLength="3" />
                <Property Name="CustomerId" Type="Edm.String" Nullable="false" MaxLength="36" />
                <Property Name="DateOfBirth" Type="Edm.DateTime" Nullable="false" />
                <Property Name="EmailAddress" Type="Edm.String" Nullable="true" MaxLength="255" />
                <Property Name="FirstName" Type="Edm.String" Nullable="true" MaxLength="40" />
                <Property Name="HouseNumber" Type="Edm.String" Nullable="true" MaxLength="10" />
                <Property Name="LastName" Type="Edm.String" Nullable="true" MaxLength="40" />
                <Property Name="PhoneNumber" Type="Edm.String" Nullable="true" MaxLength="30" />
                <Property Name="PostalCode" Type="Edm.String" Nullable="true" MaxLength="10" />
                <Property Name="Street" Type="Edm.String" Nullable="true" MaxLength="60" />
                <Property Name="Address" Type="ESPM.Address" Nullable="true" />
                <Property Name="UpdatedTimestamp" Type="Edm.DateTime" />
                <NavigationProperty Name="SalesOrders"
                    Relationship="ESPM.Customer_to_SalesOrderHeaders" FromRole="Customer"
                    ToRole="SalesOrderHeader" />
            </EntityType>
            <EntityType Name="SalesOrderHeader">
                <Key>
                    <PropertyRef Name="SalesOrderId" />
                </Key>
                <Property Name="CreatedAt" Type="Edm.DateTime" Nullable="true" />
                <Property Name="CurrencyCode" Type="Edm.String" Nullable="true" MaxLength="5" />
                <Property Name="CustomerId" Type="Edm.String" Nullable="false" MaxLength="36" />
                <Property Name="GrossAmount" Type="Edm.Decimal" Nullable="true" Precision="15"
                    Scale="3" />
                <Property Name="LifeCycleStatus" Type="Edm.String" Nullable="false" MaxLength="1" />
                <Property Name="LifeCycleStatusName" Type="Edm.String" Nullable="false"
                    MaxLength="255" />
                <Property Name="NetAmount" Type="Edm.Decimal" Nullable="true" Precision="15"
                    Scale="3" />
                <Property Name="SalesOrderId" Type="Edm.String" Nullable="false" MaxLength="36" />
                <Property Name="TaxAmount" Type="Edm.Decimal" Nullable="true" Precision="15"
                    Scale="3" />
                <NavigationProperty Name="Items"
                    Relationship="ESPM.SalesOrderHeader_to_SalesOrderItems"
                    FromRole="SalesOrderHeader" ToRole="SalesOrderItem" />
                <NavigationProperty Name="CustomerDetails"
                    Relationship="ESPM.Customer_to_SalesOrderHeaders" FromRole="SalesOrderHeader"
                    ToRole="Customer" />
            </EntityType>
            <Association Name="Customer_to_SalesOrderHeaders">
                <End Type="ESPM.Customer" Multiplicity="1" Role="Customer">
                    <OnDelete Action="None" />
                </End>
                <End Type="ESPM.SalesOrderHeader" Multiplicity="*" Role="SalesOrderHeader" />
                <ReferentialConstraint>
                    <Principal Role="Customer">
                        <PropertyRef Name="CustomerId" />
                    </Principal>
                    <Dependent Role="SalesOrderHeader">
                        <PropertyRef Name="CustomerId" />
                    </Dependent>
                </ReferentialConstraint>
            </Association>

            <EntityType Name="ConfigCategory">
                <Annotation Term="Offline.ClientOnly" />
                <Key>
                    <PropertyRef Name="id" />
                </Key>
                <Property Name="id" Nullable="false" Type="Edm.Int32" />
                <Property MaxLength="255" Name="name" Nullable="true" Type="Edm.String" />
                <NavigationProperty Name="configItems"
                    Relationship="ESPM.ConfigCategory_to_ConfigItem" FromRole="ConfigCategory"
                    ToRole="ConfigItem" />
            </EntityType>
            <EntityType Name="ConfigItem">
                <Annotation Term="Offline.ClientOnly" />
                <Key>
                    <PropertyRef Name="id" />
                </Key>
                <Property Name="id" Nullable="false" Type="Edm.Int32" />
                <Property MaxLength="255" Name="key" Nullable="true" Type="Edm.String" />
                <Property MaxLength="255" Name="value" Nullable="true" Type="Edm.String" />
                <NavigationProperty Name="category" Nullable="true"
                    Relationship="ESPM.ConfigCategory_to_ConfigItem" FromRole="ConfigItem"
                    ToRole="ConfigCategory" />
            </EntityType>
            <Association Name="ConfigCategory_to_ConfigItem">
                <End Type="ESPM.ConfigCategory" Multiplicity="1" Role="ConfigCategory">
                    <OnDelete Action="Cascade" />
                </End>
                <End Type="ESPM.ConfigItem" Multiplicity="*" Role="ConfigItem" />
            </Association>

            <EntityContainer Name="ESPMContainer" m:IsDefaultEntityContainer="true">
                <EntitySet Name="Customers" EntityType="ESPM.Customer" />
                <EntitySet Name="SalesOrderHeaders" EntityType="ESPM.SalesOrderHeader" />
                <AssociationSet Name="Customer_to_SalesOrderHeaders"
                    Association="ESPM.Customer_to_SalesOrderHeaders" sap:searchable="false">
                    <End EntitySet="Customers" Role="Customer" />
                    <End EntitySet="SalesOrderHeaders" Role="SalesOrderHeader" />
                </AssociationSet>

                <EntitySet Name="ConfigCategories" EntityType="ESPM.ConfigCategory">
                    <Annotation Term="Offline.ClientOnly" />
                </EntitySet>
                <EntitySet Name="ConfigItems" EntityType="ESPM.ConfigItem">
                    <Annotation Term="Offline.ClientOnly" />
                </EntitySet>
                <AssociationSet Name="ConfigCategories_to_ConfigItems"
                    Association="ESPM.ConfigCategory_to_ConfigItem">
                    <End EntitySet="ConfigCategories" Role="ConfigCategory" />
                    <End EntitySet="ConfigItems" Role="ConfigItem" />
                </AssociationSet>

                <EntitySet Name="DraftCustomers" EntityType="ESPM.Customer">
                    <Annotation Term="Offline.ClientOnly">
                        <Record Type="Offline.LocalDraft">
                            <PropertyValue Property="ActiveEntitySet" String="Customers" />
                        </Record>
                    </Annotation>
                </EntitySet>
                <EntitySet Name="DraftSalesOrderHeaders" EntityType="ESPM.SalesOrderHeader">
                    <Annotation Term="Offline.ClientOnly">
                        <Record Type="Offline.LocalDraft">
                            <PropertyValue Property="ActiveEntitySet" String="SalesOrderHeaders" />
                        </Record>
                    </Annotation>
                </EntitySet>
                <AssociationSet Name="DraftCustomer_to_DraftSalesOrderHeaders"
                    Association="ESPM.Customer_to_SalesOrderHeaders">
                    <End EntitySet="DraftCustomers" Role="Customer" />
                    <End EntitySet="DraftSalesOrderHeaders" Role="SalesOrderHeader" />
                </AssociationSet>
            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

Metadata Editor

The metadata XML document file can be edited with any editor that supports XML editing. More detail can be found in the MBT graphical modeler.


Last update: November 8, 2023