XMLType is a predefined type for representing XML entities as UDT objects. This is compatible with Oracle9i and later. You can get better performance and flexibility by using use plain built-in functions that directly operate with XML entities. All predefined member functions of XMLType for extracting fragments from an XMLType are actually wrappers for xpath_eval() built-in function. You can declare a column of XMLType but the actual type of the created column will be "LONG XML". Thus any XML-related feature that can be used for "LONG XML" column will work with XMLType. E.g. WITH SCHEMA constraint allows you to force stored values to match a particular schema; XML free text index can accelerate search for documents by content etc.

XMLType behaves like any user-defined type, with the only difference in type conversion rules. If an XML entity is passed as an argument instead of an instance of XMLType, a new instance of XMLType is created by a constructor that takes the entity as an argument. Similarly, functions that accept XML entities as arguments can also accept an instance of XMLType as an actual value of argument.

The following example creates a table with an XMLType column, put two records there and performs a simple search:

CREATE TABLE Xml_tab ( xmlval XMLType);

INSERT INTO Xml_tab VALUES (
   xmltype('<?xml version="1.0"?>
               <EMP>
                  <EMPNO>221</EMPNO>
                  <ENAME>John</ENAME>
               </EMP>'));

INSERT INTO Xml_tab VALUES (
   xmltype('<?xml version="1.0"?>
               <PO>
                  <PONO>331</PONO>
                  <PONAME>PO_1</PONAME>
               </PO>'));

-- now extract the numerical values for the employee numbers

SELECT e.xmlval.extract('//EMPNO/text()').getNumVal() as empno
   FROM Xml_tab
   WHERE e.xmlval.existsnode('/EMP/EMPNO')  = 1;

To create a new instance of XMLType, the constructor XMLType() or a function createXML() is used.

Virtuoso can perform XPATH search in XMLType instances: extract() and existsNode() member functions are convenient for simple searches and any built-in XPATH functions like xpath_eval() or xquery_eval() can handle XMLType parameters instead of XML entity parameters. An application can use getStringVal() , getNumVal() and getColbVal() member functions to convert found node to strings, numbers or an XML source text of the node.

Instances of the type can store the URL of the XML schema to which they should conform. This URL can be specified when an instance is constructed; Once an instance is created, its schema URL cannot be changed but a modified copy can be created by createSchemaBasedXML() and createNonSchemaBasedXML() member functions; isSchemaBased() and getSchemaURL() member functions check whether the given instance is schema based or not and what particular schema is used.

An schema based XMLType instance can be validated against its schema; If it has been validated against its schema once with no errors detected then a special "VALIDATED" flag is set in the instance indicating that there is no need to validate it again. schemaValidate() member function performs the validation, isSchemaValidated() queries the "VALIDATED" flag and setSchemaValidated() changes the "VALIDATED" flag if application needs optimization tricks.

In addition, any instance can be validated against an arbitrary schema via member function isSchemaValid() . Built-in function xml_validate_schema() may accept instance of XMLType as its first argument, providing even more validation functionality.