Gestire documenti XML (Parte I)

L' introduzione del supporto alla struttura dati XML introdotta dall' SQL Server 2005, ha rappresentato forse la principale novità di quel prodotto.Nelle precedenti versioni infatti scrivere e leggere dati in un file XML era possibile ma molto macchinoso; ora invece è possibile immagazzinare i dati contenuti nell' XML direttamente in un database SQL Server. In questo tutorial vedremo come gestire questi documenti XML.

Le migliorie importate da SQL Server 2005 in riguardo agli XML consistono in:

  • Supporto al tipo di dati XML
  • Possibilità di specificare una XQuery da eseguire su un XML suddiviso in colonne
  • Supporto al caricamento di grandi masse di dati in XML
  • Migliorate le funzioni FOR XML ed OPENXML già presentate nell' SQL Server 2000

Vediamo ora un esempio, che dimostrerà come sia possibile creare una tabella che contenga una colonna XML, inserendovi inoltre alcuni records:

  1. Creiamo una tabella con una colonna XML

            Create table dbo.Student(StudentID int,StudentName varchar(50),Studentcontactdetails XML)
    

     
  2. Inseriamo dati in XML validi nella tabella

            Insert into dbo.Student values(1,'ABC','<ROOT><Student>123,XYZ street,London</Student></ROOT>')
    

     

Nel caso avessimo inserito dati invalidi, avremmo ricevuto un errore; eccone un esempio:

Insert into dbo.Student values(1,'ABC','<ROOT><Student>123,XYZ street,London')
Msg 9400, Level 16, State 1, Line 1
XML parsing: line 1, character 36, unexpected end of input

Abbiamo anche la possibilità di dichiarare variabili XML, con il codice

Declare @x xml

Typed vs Untyped XML

Untyped XML può essere inserita in ogni forma.Quando l' utente inserisce un valore nella colonna XML, bisogna controllare che ciò che stà per essere inserito si attenga agli standards dell' XML

Typed XML è usata quando l' utente desidera convalidare l' XML con un XML Schema. Quest' ultimo va posto e catalogato nel database; in questo modo l' XML validato secondo un XML Schema risulterà essere un Typed XML, dichiarato così:

Declare @x XML(schema.xmlschemacollection)

Un XML Schema è definibile invece così:

CREATE XML SCHEMA COLLECTION [ <relational_schema>. ]sql_identifier AS Expression

con:

  • relational_schema: definisce il nome relativo allo schema
  • sql_identifier: è l' identificatore SQL dello schema XML
  • expression: è una variabile string che può essere costante o scalare

Esempio:

CREATE XML SCHEMA COLLECTION Chemicals AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root">
<complexType>
<sequence>
<element name="ChemicalName" type="string"/>
<element name="Symbol" type="string"/>
</sequence>
</complexType>
</element>
</schema>'

Ora che l' XML Schema è stato catalogato, possiamo ottenervi informazioni in riguardo usando la funzione "XML_schema_namespace" , come nell' esempio:

SELECT xml_schema_namespace(N'dbo',N'Chemicals')

Definito l' HMX Schema, possiamo usarlo per i CREATE TABLE o per il DECLARE XML. Ecco un esempio:

1)

Declare @xml xml(Chemicals)
set @xml='<root><ChemicalName>Sulphuric Acid</ChemicalName><Symbol>H2SO4</Symbol></root>'

2)

Insert into students (studentname,Labid,Experimentid,Experimentchemical)
values ('ABC',1,1,'<root><ChemicalName>Sulphuric Acid</ChemicalName><Symbol>H2SO4</Symbol></root>')

Richiedere i dati XML

Per ricavare i dati e la tipologia dati da un XML esistono diverse possibilità:

1)Metodo delle query: così si ricava un frammento di untyped XML. Con l' esempio seguente vediamo come ricavare un valore da una colonna XML:

select experimentchemical.query('/root/ChemicalName') from students

Risultato:

<ChemicalName>Sulphuric Acid</ChemicalName>

2)Metodo value: è simile al metodo delle query, ma accetta anche un parametro aggiuntivo per determinare il risultante datatype scalare.

3) Metodo di esistenza: accetta come input un' espressione, che seleziona un nodo singolo dentro il documento XML e risponde con True(1) se il nodo esiste, o con False(0) se non esiste.

Esempio:

select Experimentchemical.exist('/root/ChemicalName') from students

4) Metodo di modifica: può essere usato per manipolare i dati XML posti in una tabella. Consiste in tre sotto-dichiarazioni:

  • INSERT
  • DELETE
  • REPLACE

Esempio:

1)

declare @x xml
declare @custid int
set @x='<root>
<CustomerDescription CustID="101" CustomerName="ABCL Industries Limited">
<Phonenumber>
<Work>1234567890</Work>
<Residence>1434546678</Residence>
</Phonenumber>
</CustomerDescription>
<CustomerDescription CustID="102" CustomerName="HAL Industries Limited">
<Phonenumber>
<Work>1234567890</Work>
<Residence>1434546678</Residence>
</Phonenumber>
</CustomerDescription>
</root>'
select @x
set @x.modify('delete /root/CustomerDescription/@CustID')
select @x
Result:
<root>
<CustomerDescription CustomerName="ABCL Industries Limited">
<Phonenumber>
<Work>1234567890</Work>
<Residence>1434546678</Residence>
</Phonenumber>
</CustomerDescription>
<CustomerDescription CustomerName="HAL Industries Limited">
<Phonenumber>
<Work>1234567890</Work>
<Residence>1434546678</Residence>
</Phonenumber>
</CustomerDescription>
</root>


 

2)

Per inserire un nuovo nodo o frammento XML, possiamo usare l' INSERT, con questa sintassi:

insert
Expression1 (
{as first | as last} into | after | before
Expression2
)

Analizziamone gli argomenti:
Expression1: identifica uno o più nodi da inserire
into: i nodi identificati da Expression1 vengono inseriti come diretti discendenti del nodo identificato in Expression2. Se quest' ultimo ha già uno o più child nodes, dovremo decidere noi in quale punto inserirlo; per porlo subito dopo il nodo identificato da Expression2 useremo

after

per porlo subito dopo Expression2 useremo invece

before

per porlo congiunto al nodo definito in Expression2, useremo

Expression2

Ecco un esempio:

USE AdventureWorks;
GO
DECLARE @myDoc xml      
SET @myDoc = '<Root>      
<ProductDescription ProductID="1" ProductName="Road Bike">      
<Features>      
</Features>      
</ProductDescription>       
</Root>'      
SELECT @myDoc      
-- insert first feature child (no need to specify as first or as last)      
SET @myDoc.modify('      
insert <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
into (/Root/ProductDescription/Features)[1]')
SELECT @myDoc

Come output riceveremo:

<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>

5) Metodo dei nodi: può essere usato per estrarre dati da un documento XML e usarli per generare sottonodi sfruttabili per diversi scopi, come creare nuovi contenuti o inserirne di già pronti nelle tabelle. Ecco un esempio:

 

declare @x xml
set @x='<Root><row id="1"><AirportCode>MUM</AirportCode><AirportName>Mumbai</AirportName></row>
<row id="2"><AirportCode>MAS</AirportCode><AirportName>Madras</AirportName></row>
<row id="3"></row></Root>'

Select T.c.query('.') as result
from @x.nodes('/Root/row') T(c)

 

Leggi la seconda parte



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Francesco
Hai dubbi su questo articolo?