Download XML II

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Fractional-reserve banking wikipedia , lookup

Balance of payments wikipedia , lookup

Transcript
XMLII



XSchema
XQuery
Oracle XSU
XML Schema




XML Schema is a more sophisticated schema language which
addresses the drawbacks of DTDs. Supports
 Typing of values
 E.g. integer, string, etc
 Also, constraints on min/max values
 User-defined, complex types
 Many more features, including
 uniqueness and foreign key constraints, inheritance
XML Schema is itself specified in XML syntax, unlike DTDs
 More-standard representation, but verbose
XML Scheme is integrated with namespaces
BUT: XML Schema is significantly more complicated than DTDs.
XML Schema Version of Bank DTD
<xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema>
<xs:element name=“bank” type=“BankType”/>
<xs:element name=“account”>
<xs:complexType>
<xs:sequence>
<xs:element name=“account_number” type=“xs:string”/>
<xs:element name=“branch_name”
type=“xs:string”/>
<xs:element name=“balance”
type=“xs:decimal”/>
</xs:squence>
</xs:complexType>
</xs:element>
….. definitions of customer and depositor ….
<xs:complexType name=“BankType”>
<xs:squence>
<xs:element ref=“account” minOccurs=“0”
maxOccurs=“unbounded”/>
<xs:element ref=“customer” minOccurs=“0”
maxOccurs=“unbounded”/>
<xs:element ref=“depositor” minOccurs=“0”
maxOccurs=“unbounded”/>
</xs:sequence>
</xs:complexType>
</xs:schema>
XML Schema Version of Bank DTD



Choice of “xs:” was ours -- any other namespace prefix could be
chosen
Element “bank” has type “BankType”, which is defined separately
 xs:complexType is used later to create the named complex type
“BankType”
Element “account” has its type defined in-line
More features of XML Schema

Attributes specified by xs:attribute tag:
 <xs:attribute name = “account_number”/>
 adding the attribute use = “required” means value must be
specified
Querying and Transforming XML Data




Translation of information from one XML schema to another
Querying on XML data
Above two are closely related, and handled by the same tools
Standard XML querying/translation languages
 XPath
 Simple language consisting of path expressions
 XSLT
 Simple language designed for translation from XML to XML
and XML to HTML
 XQuery
 An XML query language with a rich set of features
XQuery




XQuery is a general purpose query language for XML data
Standardized by the World Wide Web Consortium (W3C)
XQuery is derived from the Quilt query language, which itself borrows from
SQL, XQL and XML-QL
XQuery uses a
for … let … where … order by …result …
syntax
for
 SQL from
where  SQL where
order by  SQL order by
result  SQL select
let allows temporary variables, and has no equivalent in SQL
FLWOR Syntax in XQuery



For clause uses XPath expressions, and variable in for clause ranges
over values in the set returned by XPath
Simple FLWOR expression in XQuery
 find all accounts with balance > 400, with each result enclosed
in an <account_number> .. </account_number> tag
for
$x in /bank-1/customer/account
let
$acctno := $x/account_number/text()

where $x/balance > 400
return <account_number> { $acctno } </account_number>
 Items in the return clause are XML text unless enclosed in {}, in
which case they are evaluated
Let clause not really needed in this query, and selection can be
done In XPath. Query can be written as:
for $x in /bank-1/customer/account[balance>400]
return { $x/account_number }
Joins


Joins are specified in a manner very similar to SQL
for $a in /bank/account,
$c in /bank/customer,
$d in /bank/depositor
where $a/account_number = $d/account_number
and $c/customer_name = $d/customer_name
return <cust_acct> { $c $a } </cust_acct>
The same query can be expressed with the selections specified
as XPath selections:
for $a in /bank/account
$c in /bank/customer
$d in /bank/depositor[
account_number = $a/account_number and
customer_name = $c/customer_name]
return <cust_acct> { $c $a } </cust_acct>
Nested Queries



The following query converts data from the flat structure for bank
information into the nested structure used in bank-1
<bank-1> {
for $c in /bank/customer
return
<customer>
{ $c/* }
{ for $d in /bank/depositor[customer_name =
$c/customer_name],
$a in
/bank/account[account_number=$d/account_number]
return $a }
</customer>
} </bank-1>
$c/* denotes all the children of the node to which $c is bound,
without the enclosing top-level tag
$c/text() gives text content of an element without any subelements
/ tags
Sorting in XQuery



The order by clause can be used at the end of any expression. E.g. to return
customers sorted by name
for $c in /bank/customer
order by $c/customer_name
return <customer> { $c/* } </customer>
Use order by $c/customer_name to sort in descending order
Can sort at multiple levels of nesting (sort by customer_name, and by
account_number within each customer)
<bank-1> {
for $c in /bank/customer
order by $c/customer_name
return
<customer>
{ $c/* }
{ for $d in /bank/depositor[customer_name=$c/customer_name],
$a in /bank/account[account_number=$d/account_number] }
order by $a/account_number
return <account> $a/* </account>
</customer>
} </bank-1>
Oracle XML-SQL Utility




Transform data from o-r tables/views into XML
Extract relevant data from an XML document
Insert data into database tables
 Using a canonical mapping
Available as
 Java command-line front end
 Java API
 PL/SQL API
SQL-to-XML Mapping

For each SQL query Q, will get the XML file with the following DTD
 <!DOCTYPE ROWSET[
<!ELEMENT ROWSET (ROW*)>
<!ELEMENT ROW (attribute-list returned by Q)>
]>
 If some attribute is of nested table type, then the element will
have sub-element corresponding to the attributes of the nested
table
Example of SQL-to-XML


We first create a table country
CREATE TABLE country
(name char(50),
region char(60),
area decimal(10),
population decimal(11),
gdp decimal(14),
primary key (name)
);
Example of SQL-to-XML
CREATE TYPE CountriesType AS OBJECT (
country_name char(50),
area
decimal(10),
population decimal(11),
gdp decimal(14)
);
/
CREATE TYPE CountriesTableType AS TABLE OF CountriesType;
/
CREATE TABLE Regions (
region_name char(60),
countries CountriesTableType,
area
decimal(10),
population decimal(11),
gdp decimal(14)
)
NESTED TABLE Countries STORE AS CountriesTable;
Example of SQL-to-XML
INSERT INTO Regions(region_name,area,population,gdp)
SELECT region, SUM(area), SUM(population), SUM(gdp)
FROM country
GROUP BY region;
UPDATE Regions
SET countries =
CAST(MULTISET(
SELECT *
FROM country
WHERE region = Regions.region_name)
AS CountriesTableType );
Example of SQL-to-XML






Root – ROWSET element
Each row – ROW element
Each simple attribute – sub-element of ROW element
Each nested table attribute – sub-element with sub-element
Each ROW element has a num attribute
Null values are left out
Java front-end utility - OracleXML
Export CLASSPATH=/usr/local/oracle/software/jdbc/lib/classes12.zip:/usr/local/oracle/software/rdbms/jlib/xsu11.jar:.


java OracleXML getXML \
-user “username/passwd”\
-conn “jdbc:oracle:thin:@erg.csci.unt.edu:1521:ERG”\
“select * from country”
OracleXML parameters
 User name and password
 JDBC connection string
 SQL query
Extract data from the database to XML form
A Few More Options
java OracleXML getXML -user ‘user/passwd'
-conn 'jdbc:oracle:thin:@erg.csci.unt.edu:1521:ERG' \
-withDTD -rowsetTag 'countries' -rowTag 'country' -rowIdAttr 'countryID' \ 'select
name as "@countryname", gdp, area from country‘





-withDTD: generate the DTD
-rowsetTag: specify the rowsetTag name
-rowTag: specifiy the rowTag name
-rowIdAttr: specify the name of the row ID attribute of each row
name as “@countryname” rename the name sub-element tag to “countryname” tag
XSU Java API




Through Java API
Allow generation of XML data
Allow insertion of data from an XML document
Allow delete and updates based on XML document
API classes


Oracle.xml.sql.query.OracleXMLQuery (for query)
 Create a JDBC Connection
 Create an OracelXMLQUery instance
 Set options in the OracleXMLQuery object
 Obtain the results
Oracle.xml.sql.dml.OracleXMLSave (for update, insert, and delete)
 Create a JDBC Connection
 Creat and OracleXMLSave object
 Set options in the OracleXMLSave ojbect
 Invoke the proper method to insert, delete, or update
Extracting XML
import
import
import
import
oracle.jdbc.driver.*;
oracle.xml.sql.query.OracleXMLQuery;
java.lang.*;
java.sql.*;
public class xsuGet {
public static void main(String[] argv) throws SQLException {
try {
Class.forName ("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println ("Could not load the driver");
return;
}
Connection conn =
DriverManager.getConnection(
"jdbc:oracle:thin:@erg.csci.unt.edu:1521:ERG", “username",“passwd");
// Create the query class.
OracleXMLQuery qry = new OracleXMLQuery(conn, "select * from regions");
// Get the XML string
String str = qry.getXMLString();
}
}
// Print the XML output
System.out.println(" The XML output is:\n"+str);
qry.close();
conn.close();
XMLType



A system defined object
With built in member functions
 Create, extract, and index XML data
Can be used as column type
Define a table with XMLType
CREATE TABLE addrbook(
name varchar(20),
card SYS.XMLTYPE,
creationDate Date
);

Address book has a name, a creationData, and a XMLType
attribute to contain the contact information structured in XML
format
XMLType Insertion

Use member function createXML(‘xml data’); Example:
insert into addrbook values
('Roger', sys.XMLType.createXML(
'<ACARD CREATEDBY="raj">
<EMAIL>[email protected]</EMAIL>
<WPHONE>111-5678</WPHONE>
<ADDRESS>
<LINE1>123 Main Street</LINE1>
<CITY>Atlanta</CITY>
<STATE>GA</STATE>
<ZIP>33333</ZIP>
</ADDRESS>
Non-well-formed
</ACARD>'), sysdate);
will be rejected
XML
Querying XML Data


Use member function:
 getClobVal CLOB (Character Large Object)
 getStringVal
 GetNumberVal
 Extract(‘Xpath expression’)
Example:
select a.card.extract('/ACARD').getstringVal()
from addrbook a
where name = 'Roger';