15.10. XMLType
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.