# XML processing environment service

This chapter covers the fundamental objects of the XML processing environment service. This service provides the support for processing xml document that could be accessed locally or other the Internet. In particular, the processing environment supports the XML include facility.

All xml processing environment objects are located in the `afnix-xpe` service module. This module must be loaded prior any operation. Multiple calls to the module initialization routine are harmless. The interpreter method `library` loads a specific service module by name. When the module has been loaded, the objects are available in the `afnix:xpe` nameset. Unlike a module, a service module might refer to objects associated with other module. Although the objects are visible internally to the engine, their symbols are not exported until a call with the `library` method has been made.

interp:library "afnix-xpe"

## XML content

The `XmlContent` class is an extension of the XML document object that provides the service for loading a XML document locally or from the Internet. The class operates with an uri, which permits to selects the appropriate loader from the uri scheme.

### Content creation

The `XmlContent` operates with an uri that permits to select the appropriate loader. If the uri scheme is a file scheme, the content is retrieved locally. If the uri scheme is http, the content is retrieved by establishing a http connection over the Internet.

# create a document from a local file const xdoc (afnix:xpe:XmlContent "file:///home/afnix/file.xml")

When the uri scheme is a file, the uri authority is empty (hence the double //) and the path indicates the file to parse. The XmlContent object is derived from the `XmlDocument` object which contains the parsed tree with the `XmlRoot` object.

# create a document from a http connection const xdoc (afnix:xpe:XmlContent "http://www.afnix.org/index.xht")

When the uri scheme is a http scheme, the document is downloaded by establishing an http connection with the uri authority. When the http header is received, the content is parsed to create a valid xml document. If the http response header indicates that the page has moved and a new location is provided, the object manages automatically to follow such location.

### Content and document name

Since the `XmlContent` object is derived from the `XmlContent` object, the content object is defined with a uri name and a document name. Under normal circumstances, the document name is derived from the content name by normalizing it. The content name is the object constructor name, while the document name is the normalized document name. The `get-name` method returns the content name while the `get-document-name` method returns the document name.

# create a document by name const xdoc (afnix:xpe:XmlContent "file" "file.xml")

In the previous example, a xml content object is created by name with a document name. It is the document name that gets normalized. Therefore in the previous example, the file.xml document name is normalized into a file uri. The normalization rule always favor the file scheme. This means that without a scheme, the file scheme is automatically added.

### Content type

Many times, the content type cannot be detected from the uri name. Once opened, if the content header provides a clue about the content type, the opened input stream get adjusted automatically to reflect this fact. However, this situation does not occurs often and with http scheme, the content type header response does not often provides the character encoding associated with the stream. For this reason, the `XmlContent` constructor provides a mechanism to accept the encoding mode.

# create a new content by name and encoding mode const xdoc (afnix:xpe:XmlContent "file" "file.xml" "UTF-8")