Skip to content

Format Specification

The format specification of the data feed describes how the product data needs to be formatted and structured to be imported into eSales Fashion. The data feed is an XML-file encoded using UTF-8.

Market identifiers and key conventions

Market identifiers and the keys for product groups, products, and variants must be consistent across the data feed, the order notifications, and the order history. Keys must be unique within all the key attributes in a market.

Note that all identifiers and keys are case sensitive.

File syntax example
<?xml version="1.0" encoding="UTF-8" ?>
<fashion_data_import type="full">
    <modify market="UK" locale="en-GB">
        <product_groups>
            <add_or_replace>
                <product_group key="123">
                    <brand>Apparel</brand>
                    <department>Men</department>
                    <size_type>Men's Clothing</size_type>
                    <products>
                        <product key="123-B">
                            <title>Linen T-shirt</title>
                            <release_date>2017-10-27T11:16:07Z</release_date>
                            <url>/products?product_key=123-B</url>
                            <pattern>Striped</pattern>
                            <description>Loose-fit T-shirt with a slightly lower neckline.</description>
                            <additional_autocomplete_phrases>T-Shirts|Brown T-Shirts</additional_autocomplete_phrases>
                            <images>
                                <image type="model">
                                    <url resolution="card">//site.com/images/123-B_model.jpg</url>
                                    <url resolution="thumbnail">//site.com/images/123-B_model_thumbnail.jpg</url>
                                </image>
                                <image type="cutout">
                                    <url resolution="card">//site.com/images/123-B_cutout.jpg</url>
                                    <url resolution="thumbnail">//site.com/images/123-B_cutout_thumbnail.jpg</url>
                                </image>
                            </images>
                            <rating>4.3</rating>
                            <!-- Example of custom used-defined attributes -->
                            <custom_attributes>
                                <season>Summer</season>
                                <style>Casual</style>
                                <category>T-Shirts</category>
                            </custom_attributes>
                            <variants>
                                <variant key="123-B-S">
                                    <sizes>
                                        <size format="SML">S</size>
                                        <size custom_format="US">6</size>
                                    </sizes>
                                    <stock_number>27</stock_number>
                                    <selling_price>9.99</selling_price>
                                    <list_price>12.99</list_price>
                                    <cost>8.00</cost>
                                    <url>/variant?variant_key=123-B-S</url>
                                </variant>
                                <variant key="123-B-M">
                                    <sizes>
                                        <size format="SML">M</size>
                                        <size custom_format="US">8</size>
                                    </sizes>
                                    <stock_number>0</stock_number>
                                    <selling_price>9.99</selling_price>
                                    <list_price>12.99</list_price>
                                    <cost>8.00</cost>
                                    <url>/variant?variant_key=123-B-M</url>
                                </variant>
                            </variants>
                        </product>
                    </products>
                </product_group>
            </add_or_replace>
        </product_groups>
        <content_links> 
            <add_or_replace>
                <content_link key="871">
                    <title>Shipping</title>
                    <url>/uk/customer-service/shipping</url>
                </content_link>
                <content_link key="872">
                    <title>Contact</title>
                    <url>/uk/contact</url>
                </content_link>
            </add_or_replace>
        </content_links>
    </modify>
</fashion_data_import>

Product data

Product data consist of product groups that include products that in turn include variants.

Data model concept - product groups, products, and variants

No empty elements or attributes are allowed, i.e. <element></element>, <element/>, or attribute="". Maximum length of an element value is 2 000 000 characters.

Product group

The first level of the data model is the product group (the overall article). The product group holds attributes that are common for all its products and variants. A product group must contain at least one product.

<product_group key="123">
    <brand>Apparel</brand>
    <department>Men</department>
    <size_type>Men's Clothing</size_type>
    <products>
        ... <!-- As described in the product section -->
    </products>
</product_group>

Elements and attributes

Name Description
key The key of this product group, must be unique within all key attributes for the market. Maximum length is 200 characters and allowed characters are A-Z, a-z, 0-9, and /_-.
Required attribute.
brand The brand appears in the product card. It is searchable and visible as an autocomplete phrase. It can be used as a facet.
Required element.
department Element used to filter on department. It can be used as a facet.
Required element.
size_type Used to group each size under a header in the size facet. Product groups without this element can only have one variant.
Recommended element.
products
Details
Group element for products. Requires at least one product.
Required element for Fashion data import.
Not allowed for Fashion attribute modification.

Product

A product is a colour or style variation of a product group and contains attributes that are specific to this variation. Each product in turn must contain at least one variant and is strongly recommended to have at least one image.

<product key="123-B">
    <title>Linen T-shirt</title>
    <release_date>2017-10-27T11:16:07Z</release_date>
    <url>/products?product_key=123-B</url>
    <pattern>Striped</pattern>
    <description>Loose-fit T-shirt with a slightly lower neckline.</description>
    <additional_autocomplete_phrases>T-Shirts|Brown T-Shirts</additional_autocomplete_phrases>
    <images>
        ... <!-- As described in the images section -->
    </images>
    <rating>4.3</rating>
    <custom_attributes><!-- Example of custom user-defined attributes -->
        <season>Summer</season>
        <style>Casual</style>
        <category name="T-shirts">349</category>
    </custom_attributes>
    <variants>
        ... <!-- As described in the variant section -->
    </variants>
</product>

Display name support for attribute values

Since all attribute values used for product selections must be based on stable values, there are occasions where a merchandiser may have to work with system generated numbers or codes. Support for display names of attribute values have been added to facilitate working with product selections with unintelligible values. This means that the product selection remains stable, while it is possible to work with readable names in the apps.

How to use

Supply display names in the data feed for values where identifiers aren't human friendly. The following illustrates the syntax of the category T-shirts with an extenal id 349: <category name="T-shirts">349</category>.

<!-- Example of custom user-defined attributes with display names -->
<custom_attributes>
    <season name="Summer">m_678</season>
    <style name="Casual">m_c_349</style>
    <category name="T-shirts">349</category>
</custom_attributes>

Elements and attributes

Name Description
key The key of this product, must be unique within all key attributes for the market. Maximum length is 200 characters and allowed characters are A-Z, a-z, 0-9, and /_-.
Required attribute.
title The title of the product. Searchable and shown in product cards, and completions.
Required element.
url The URL to the product page with this colour/style pre-selected. Must be relative to page root, i.e. start with /.
Relative path: /products?product_key=123-B
Required element.
images
Details
Group element for images. Requires at least one image if present.
variants
Details
Group element for variants. Requires at least one variant. Product groups without size_type can only have one variant.
Required element for Fashion data import.
Not allowed for Fashion attribute modification.
release_date Used for ranking and adding badges to new items and for sorting by newest first. The time is in the ISO 8601 format, including offset.
color_override This attribute allows for overriding analysed colours for the product. This is useful for the unusual cases where the automatic image analysis does not give satisfying results, or if the product has a metallic colour. The colours will be searchable, can be used in the colour facet, and will show up as a swatch on the product card if the product is available in different colours. Valid values are: colours in hex (e.g. #ffffff), Gold, Silver, or Multi. Supports multiple pipe-separated (|) values.
color_default This attribute is a backup colour for the product. The colour specified in this attribute will be active if color_override is not set and the automatic image analysis does not give results, for instance if a cutout image isn't available. Valid values are: colours in hex (e.g. #ffffff), Gold, Silver, or Multi. Supports multiple pipe-separated (|) values.
pattern An optional pattern such as Dotted or Striped, for faceting. Supports multiple pipe-separated (|) values.
description A product description used for product pages. The description is not searchable by default. To enable search hits in the description element, contact Apptus Support.
additional_autocomplete_phrases Phrases that can be of good use in autocomplete, but don’t fit in as any of the other attributes. As there is not yet a standard category attribute, it is highly advisable to add category/product type names here. Supports multiple pipe-separated (|) values.
rating A product rating from 0.0 to 5.0.
custom_attributes Group element for custom user-defined attributes. These can be used in facets and search. Custom attributes are selected for use as facets in the Experience app. Supports multiple pipe-separated (|) values. Maximum length of the name of a custom element is 2 000 characters. Custom attributes can have an additional name attribute if the identifier is not human friendly, see Display name support of attribute values.

Images

The images element is a part of the product element and contains one or more image elements. Multiple image elements with the same type are allowed.

The image element defines a single image which may have URLs with different resolutions of the same image. An image element must have at least one URL and URLs must be unique within a product.

For more information about selecting product imagery, see the image guidelines.

<images>
    <image type="model">
        <url resolution="card">//cdn.site.com/images/123-B_model.jpg</url>
        <url resolution="thumbnail">//cdn.site.com/images/123-B_model_thumbnail.jpg</url>
    </image>
    <image type="model">
        <url resolution="card">//cdn.site.com/images/123-B_model_2.jpg</url>
    </image>
    <image type="cutout">
        <url resolution="card">//cdn.site.com/images/123-B_cutout.jpg</url>
        <url resolution="thumbnail">//cdn.site.com/images/123-B_cutout_thumbnail.jpg</url>
    </image>
</images>

Elements and attributes

Name Description
image A group element for the url elements of this type.
Required element.
type The type of image. Supported types are: model and cutout. The type model is an image of a model with the product. The type cutout is an isolated image of only the product with a single colour background that differs from the colour of the product. The cutout image will be used for automatic colour extraction. Multiple image elements of the model type are allowed.
Required attribute.
url URL to the image in the given resolution. Must be absolute and start with http://, https://, or //. Using // is good practice, as it will use the same scheme as the site.
Absolute path: //cdn.site.com/images/123-B_cutout.jpg
Required element.
resolution Resolution of the image with this URL. Supported values are: card and thumbnail. If a thumbnail version is missing, don't duplicate the card URL, eSales will handle this automatically.
Required attribute.

Variant

A variant is a SKU (stock-keeping-unit) and contains attributes that are specific to the SKU.

<variant key="123-B-S">
    <sizes>
       ... <!-- As described in the Sizes section. -->
    </sizes>
    <stock_number>27</stock_number>
    <selling_price>9.99</selling_price>
    <list_price>12.99</list_price>
    <cost>8.00</cost>
    <url>/variant?variant_key=123-B-S</url>
</variant>

Elements and attributes

Name Description
key The key of the variant element, must be unique within all key attributes for the market. Maximum length is 200 characters and allowed characters are A-Z, a-z, 0-9, and /_-.
Required attribute.
sizes
Details
A group element for the size element of this variant. Includes a list of sizes in one or more formats.
Required element if size_type is present in the Product group.
Forbidden element if size_type is not present in the Product group.
stock_number Number of items in stock, used in ranking and marking the variant as out-of-stock.
Required element.
selling_price The price that the customer pays. When the variant is on sale, the selling_price is lower than the list_price. Displayed on the product card and used for badges. Must be less than or equal to the list_price.
Required element.
list_price The price displayed in the shop as the standard price. Must be greater than or equal to the selling_price.
Required element.
cost The cost of the product. Can also be provided in payment notifications, in which case the notification cost has precedence. Used for reports and is required for utilising profit-optimising algorithms. Never sent client side.
url The URL to the product page with this size pre-selected. Must be relative to page root, i.e. start with /.
Relative path: /variant?variant_key=123-B-S

Sizes

Each variant has a single physical size, but the size can be expressed in several formats. For example, a shirt can be considered both a size S and a size 34 simultaneously. If multiple formats are known, all should be provided.

The sizes element contains one or more size elements, which define the same size in different formats.

The format can be an eSales predefined format or a custom_format. A size element must have a format or custom_format attribute and only one of them can be set on the element. The size value is given in the text value of the element. Multiple variants with the same size format and value are not allowed.

<sizes>
    <size format="SML">S</size>
    <size custom_format="EU">34</size>
</sizes>

Elements and attributes

Name Description
size The actual size of a variant in a specific format.
Required element.
format Attribute to the size element. The format is a pre-defined format. Currently only SML (small-medium-large) is defined with sizes between 9XS and 9XL. Sizes can be written with both letters and numbers, such as 3XL and XXXL, and include combined sizes such as XS/S and M/L. Formats help eSales to sort the value of size correctly and to group different formats together in facets. See also size_type in Product group.
custom_format Attribute to the size element. If the size is on a different format than any of the pre-defined formats, the custom_format attribute can be set to any desired format. Different formats should be used when the size is on a different format than the pre-defined formats. This is to avoid that the size facet get mixed values.

Content links enable visitors to find editorial content on the site, such as shipping and contact information. Content links are usually placed after the product groups in the import files.

<content_link key="871">
    <title>Shipping</title>
    <url>/uk/customer-service/shipping</url>
</content_link>

Elements and attributes

Name Description
key The key of this content link, must be unique for the market. Maximum length is 200 characters and allowed characters are A-Z, a-z, 0-9, and /_-.
Required attribute.
title Title to be displayed as text completion.
Required element.
url URL to the page on this topic. Can be relative or absolute. Relative URLs must be relative to page root, i.e. start with /. Absolute URLs must start with http://, https://, or //. Using // for absolute URLs is good practice, as it will use the same scheme as the site.
Relative path: /uk/customer-service/shipping
Absolute path: //cdn.site.com/uk/customer-service/shipping
Required element.

Market

Products, variants, content links, and behavioural statistics are all tied to a market. A market has a locale (a language/country combination) to correctly handle the text content of its entities. A market cannot contain products in more than one language, so sites with one physical market with multiple languages must be treated as different markets in the data feed.

If a site is available in multiple languages, it must use different markets, each with their own products. When a web site queries eSales, it states which market to fetch content for. Behavioural statistics are collected, and can be viewed, by market.

Market identifiers and key conventions

Market identifiers and the keys for product groups, products, and variants must be consistent across the data feed, the order notifications, and the order history. Keys must be unique within all the key attributes in a market.

Note that all identifiers and keys are case sensitive.

Imports

An import can be either a full, a partial, or an attribute modification import. The import type is based on the root element of the import file. The import file type is XML and must be encoded using UTF-8.

A full import is used to set the complete state of the product and content link data of a market. Partial updates are used to a add, replace, or remove product or content link items.

The attribute modification import has a different root element than full and partial imports. It is used for frequent updates of product attributes such as selling_price and stock_number. Only attributes defined in the import will be modified.

For more information on when to use full, partial, or attribute modifications imports, see Continuous product feed.

Fashion data import

The fashion data import is either full or partial and is the root element of an import XML file. Three elements, remove_all, remove, and add_or_replace, in the XML file define what eSales will do with the data in the file.

The full import sets the complete state of the data, thus anything that is not declared in the import will be deleted from eSales, regardless of market. This enables a retailer to do a full synchronisation between their systems and eSales. Data is added into eSales by using the add_or_replace element.

A partial import have the type attribute set to partial. This means that no data is automatically removed at the beginning of the import unless remove or remove_all are present in the file before using add_or_replace.

Elements and attributes

Name Description
type Defines the type of import when using fashion_data_import. Valid values are full and partial.
Required attribute.
add_or_replace Operation that adds new, or update existing, product_groups or content_links for the market that is modified by the import.
remove Operation that allows removal of an individual product_group or content_link. Requires a key value for each element that is to be removed.
remove_all Operation that removes all product_groups or content_links for the market that is modified by the import.
modify Element that defines the market and locale to perform import operations on.
Required element.

Modify

The modify element is used by the full and partial import methods. It defines the market and locale of an import. Multiple markets can be modified in the same import. A market can only be modified once during an import.

<modify market="UK" locale="en-GB">
    <!-- Product groups and content links for the market UK -->
</modify>
<modify market="SE" locale="sv-SE">
    <!-- Product groups and content links for the market SE -->
</modify>

Elements and attributes

Name Description
market
Details
A market key. Maximum length is 40 characters and allowed characters are A-Z, a-z, 0-9, and _-.
Required attribute.
locale Locale for searching, used when matching items in the market. Also defines which synonyms will be used. Given on the format <language>-<COUNTRY>, e.g. en-GB.

An important thing to note is that setting the locale will change the locale for all items in the market, including previously imported items.

Current supported locales: da-DK, de-DE, en-GB, en-US, fi-FI, nb-NO, nn-NO, and sv-SE.
Required attribute.

Fashion attribute modification

The fashion attribute modification import has the root element fashion_attribute_modification in the import XML file.

All objects that are to be modified, such as product_groups, product, and variant, are identified by their key attribute values. Nesting of products within product groups and variants within products in the XML is not allowed.

The modify_attributes element is used by the Fashion attribute modification. It defines what existing market that content will be operated on. Multiple markets can be modified in the same import. A market can only be modified once during an import.

Product groups, products, variants, and content links are modified separately when performing a Fashion attribute modification.

<fashion_attribute_modification> 
    <modify_attributes market="UK">
        <product_groups>
            <!-- Modifications on the Product groups level for the market UK -->
        </product_groups>
        <products>
            <!-- Modifications on the Products level for the market UK -->
        </products>
        <variants>
            <!-- Modifications on the Variants level for the market UK -->
        </variants>
    </modify_attributes>
</fashion_attribute_modification>

Elements and attributes

Name Description
modify_attributes Element that defines the market to perform updates on.
Required element.
market
Details
A market key. Maximum length is 40 characters and allowed characters are A-Z, a-z, 0-9, and _-.
Required attribute.
product_groups Element that contains the product groups that are to be modified.
products Element that contains the products that are to be modified.
variants Element that contains the variants that are to be modified.

Import examples

Full import

The following example will add items to a site with market set to UK and locale set to en-GB. Any previous data not included in the import will be deleted from eSales, regardless of market.

Full import example
<?xml version="1.0" encoding="UTF-8" ?>
<fashion_data_import type="full">
    <modify market="UK" locale="en-GB">
        <product_groups>
            <add_or_replace>
                <product_group key="123">
                    <brand>Apparel</brand>
                    <department>Men</department>
                    <size_type>Men's Clothing</size_type>
                    <products>
                        <product key="123-B">
                            <title>Linen T-shirt</title>
                            <release_date>2017-10-27T11:16:07Z</release_date>
                            <url>/products?product_key=123-B</url>
                            <pattern>Striped</pattern>
                            <description>Loose-fit T-shirt with a slightly lower neckline.</description>
                            <additional_autocomplete_phrases>T-Shirts|Brown T-Shirts</additional_autocomplete_phrases>
                            <images>
                                <image type="model">
                                    <url resolution="card">//site.com/images/123-B_model.jpg</url>
                                    <url resolution="thumbnail">//site.com/images/123-B_model_thumbnail.jpg</url>
                                </image>
                                <image type="cutout">
                                    <url resolution="card">//site.com/images/123-B_cutout.jpg</url>
                                    <url resolution="thumbnail">//site.com/images/123-B_cutout_thumbnail.jpg</url>
                                </image>
                            </images>
                            <rating>4.3</rating>
                            <!-- Example of custom used-defined attributes -->
                            <custom_attributes>
                                <season>Summer</season>
                                <style>Casual</style>
                                <category>T-Shirts</category>
                            </custom_attributes>
                            <variants>
                                <variant key="123-B-S">
                                    <sizes>
                                        <size format="SML">S</size>
                                        <size custom_format="US">6</size>
                                    </sizes>
                                    <stock_number>27</stock_number>
                                    <selling_price>9.99</selling_price>
                                    <list_price>12.99</list_price>
                                    <cost>8.00</cost>
                                    <url>/variant?variant_key=123-B-S</url>
                                </variant>
                                <variant key="123-B-M">
                                    <sizes>
                                        <size format="SML">M</size>
                                        <size custom_format="US">8</size>
                                    </sizes>
                                    <stock_number>0</stock_number>
                                    <selling_price>9.99</selling_price>
                                    <list_price>12.99</list_price>
                                    <cost>8.00</cost>
                                    <url>/variant?variant_key=123-B-M</url>
                                </variant>
                            </variants>
                        </product>
                    </products>
                </product_group>
            </add_or_replace>
        </product_groups>
        <content_links> 
            <add_or_replace>
                <content_link key="871">
                    <title>Shipping</title>
                    <url>/uk/customer-service/shipping</url>
                </content_link>
                <content_link key="872">
                    <title>Contact</title>
                    <url>/uk/contact</url>
                </content_link>
            </add_or_replace>
        </content_links>
    </modify>
</fashion_data_import>

Partial import

The following example of a partial import that will add or replace one or more product groups, products, variants and content links in an existing market with the key UK. The items are identified using their key-values.

Partial import example with add or replace
<?xml version="1.0" encoding="UTF-8" ?>
<fashion_data_import type="partial">
    <modify market="UK" locale="en-GB">
        <product_groups>
            <add_or_replace>
                <product_group key="123"> 
                    <!-- attributes omitted for brevity -->
                    <products>
                        <product key="123-B"> 
                            <!-- attributes omitted for brevity -->
                            <variants>
                                <variant key="123-B-S"> 
                                    <!-- attributes omitted for brevity -->
                                </variant>
                            </variants>
                        </product>
                    </products>
                </product_group>
                <product_group key="124"> 
                    <!-- ... --> 
                </product_group>
            </add_or_replace>
        </product_groups>
        <content_links>
            <add_or_replace>
                <content_link key="871"> 
                    <!-- attributes omitted for brevity -->
                </content_link>
            </add_or_replace>
        </content_links>
    </modify>
</fashion_data_import>

The following example of a partial import will remove an existing market with the key UK.

Partial import example with remove all
<?xml version="1.0" encoding="UTF-8" ?>
<fashion_data_import type="partial">
    <modify market="UK" locale="en-GB">
        <product_groups>
            <remove_all/>
        </product_groups>
        <content_links>
            <remove_all/>
        </content_links>
    </modify>
</fashion_data_import>

The following example of a partial import will remove a specific product_group and content_link from an existing market with the key UK. The items are identified using their key-values.

Partial import example with remove
<?xml version="1.0" encoding="UTF-8" ?>
<fashion_data_import type="partial">
    <modify market="UK" locale="en-GB">
        <product_groups>
            <remove>
                <!-- Removes product group with key = 123 from market UK-->
                <product_group key="123"/>
            </remove>
        </product_groups>
        <content_links>
            <remove>
                <!-- Removes content link with key 984 from market UK -->
                <content_link key="984"/>
            </remove>
        </content_links>
    </modify>
</fashion_data_import>

Attribute modification

The common use-case for attribute modifications is when updating prices and stock numbers.

The following example of an attribute modification import will update specific values for a product_group , a product, and a variant on an existing market with the key UK. The items are identified using their key-values.

Attribute modification import example
<?xml version="1.0" encoding="UTF-8" ?>
<fashion_attribute_modification>
    <modify_attributes market="UK">
        <product_groups>
            <!-- Update product group with key 123, 
            changing only its brand and leaving everything else untouched -->
            <product_group key="123">
                <brand>Armani</brand>
            </product_group>
        </product_groups>
        <products>
            <!-- Update product with key 456-B, 
            changing only its title and its custom attribute season -->
            <product key="456-B">
                <title>Brown Linen T-shirt</title>
                <custom_attributes>
                    <season>Winter</season>
                </custom_attributes>
            </product>
        </products>
        <variants>
            <!-- Update variant with key 1157-R-S, 
            changing only its stock_number and selling_price -->
            <variant key="1157-R-S">
                <stock_number>20</stock_number>
                <selling_price>8.99</selling_price>
            </variant>
        </variants>
    </modify_attributes>
</fashion_attribute_modification>

Escaping special characters

Some elements in the data model can take multiple pipe-separated (|) values. Therefore, if the pipe character is part of the data, it must be escaped using backslash, \, before the actual character, \|. Using backslash in the data must also be escaped using another backslash \\.

Escaping must be done for values in all elements, including single-value elements.

Character escaping example
<?xml version="1.0" encoding="UTF-8" ?>
<fashion_attribute_modification>
    <modify_attributes market="UK">
        <products>
            <!-- Update product with key 456-B, 
            changing custom attributes -->
            <product key="456-B">
                <custom_attributes>
                    <!-- This results in two values as the pipe is not escaped-->
                    <tags>Shoes|Boots</tags>
                    <!-- This results in escaped characters-->
                    <escaped_pipe>This is a vertical bar, a.k.a. pipe: \|</escaped_pipe>
                    <escaped_slash>This is a backslash: \\</escaped_slash>
                </custom_attributes>
            </product>
        </products>
    </modify_attributes>
</fashion_attribute_modification>
×
Copyright

This online publication is intellectual property of Apptus Technologies. Its contents can be duplicated in part or whole, provided that a copyright label is visibly located on each copy and the copy is used in conjunction with the product described within this document.

All information found in these documents has been compiled with utmost attention to detail. However, this does not guarantee complete accuracy. Neither Apptus Technologies nor the authors shall be held liable for possible errors or the consequences thereof.

Software and hardware descriptions cited in these documents might be registered trademarks. All trade names are subject to copyright restrictions and may be registered trademarks. Apptus Technologies essentially adheres to the manufacturer’s spelling. Names of products and trademarks appearing in this document, with or without specific notation, are likewise subject to trademark and trade protection laws and may thus fall under copyright restrictions.

CLOSE