Specificare uno spazio dei nomi di destinazione usando l'attributo targetNamespace (SQLXML 4.0)
Si applica a: SQL Server Database SQL di Azure
Nella scrittura di schemi XSD, è possibile usare l'attributo XSD targetNamespace
per specificare uno spazio dei nomi di destinazione. Questo articolo descrive il funzionamento degli attributi XSD targetNamespace
, elementFormDefault
e attributeFormDefault
, il modo in cui influiscono sull'istanza XML generata e il modo in cui le query XPath vengono specificate con gli spazi dei nomi.
È possibile usare l'attributo xsd:targetNamespace
per inserire elementi e attributi dallo spazio dei nomi predefinito in uno spazio dei nomi diverso. È inoltre possibile specificare se gli elementi e gli attributi dello schema dichiarati localmente devono essere qualificati da uno spazio dei nomi, sia in modo esplicito mediante un prefisso sia in modo implicito per impostazione predefinita. È possibile usare gli elementFormDefault
attributi e attributeFormDefault
nell'elemento <xsd:schema>
per specificare a livello globale la qualificazione di elementi e attributi locali oppure è possibile usare l'attributo form
per specificare singoli elementi e attributi separatamente.
Esempi
Per creare esempi reali utilizzando gli esempi seguenti, è necessario soddisfare alcuni requisiti. Per altre informazioni, vedere Requisiti per l'esecuzione di esempi SQLXML.
R. Specificare uno spazio dei nomi di destinazione
Lo schema XSD seguente specifica uno spazio dei nomi di destinazione usando l'attributo xsd:targetNamespace
. Lo schema imposta anche i valori dell'attributo elementFormDefault
e attributeFormDefault
su "unqualified"
(il valore predefinito per questi attributi). Si tratta di una dichiarazione globale e influisce su tutti gli elementi locali (<Order>
nello schema) e sugli attributi (CustomerID
, ContactName
e OrderID
nello schema).
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
xmlns:CO="urn:MyNamespace"
targetNamespace="urn:MyNamespace">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustOrders"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer"
sql:relation="Sales.Customer"
type="CO:CustomerType" />
<xsd:complexType name="CustomerType">
<xsd:sequence>
<xsd:element name="Order"
sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustOrders"
type="CO:OrderType" />
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="SalesPersonID" type="xsd:string" />
</xsd:complexType>
<xsd:complexType name="OrderType">
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
Nello schema:
Le
CustomerType
dichiarazioni di tipo eOrderType
sono globali e, pertanto, sono incluse nello spazio dei nomi di destinazione dello schema. Di conseguenza, quando si fa riferimento a questi tipi nella dichiarazione di<Customer>
elemento e nel relativo<Order>
elemento figlio, viene specificato un prefisso associato allo spazio dei nomi di destinazione.L'elemento
<Customer>
è incluso anche nello spazio dei nomi di destinazione dello schema perché è un elemento globale nello schema.
Eseguire sullo schema la query Xpath seguente:
(/CO:Customer[@CustomerID=1)
La query XPath genera questo documento dell'istanza (sono mostrati solo alcuni ordini):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<y0:Customer xmlns:y0="urn:MyNamespace"
CustomerID="ALFKI" ContactName="Maria Anders">
<Order CustomerID="ALFKI" OrderID="10643" />
<Order CustomerID="ALFKI" OrderID="10692" />
...
</y0:Customer>
</ROOT>
Questo documento di istanza definisce lo spazio dei nomi urn:MyNamespace e associa un prefisso (y0) a esso. Il prefisso viene applicato solo all'elemento <Customer>
globale. L'elemento è globale perché viene dichiarato come elemento figlio dello <xsd:schema>
schema.
Il prefisso non viene applicato agli elementi e agli attributi locali perché il valore di elementFormDefault
e attributeFormDefault
attributi è impostato su "unqualified"
nello schema. L'elemento <Order>
è locale perché la relativa dichiarazione viene visualizzata come figlio dell'elemento <complexType>
che definisce l'elemento <CustomerType>
. Analogamente, gli attributi (CustomerID
, OrderID
e ContactName
) sono locali, non globali.
Creare un esempio funzionante di questo schema
Copiare il codice dello schema precedente e incollarlo in un file di testo. Salvare il file come
targetNamespace.xml
.Copiare il modello seguente e incollarlo in un file di testo. Salvare il file con nome
targetNameSpaceT.xml
nella stessa directory in cui è stato salvatotargetNamespace.xml
.<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="targetNamespace.xml" xmlns:CO="urn:MyNamespace"> /CO:Customer[@CustomerID=1] </sql:xpath-query> </ROOT>
La query XPath nel modello restituisce l'elemento
<Customer>
per il cliente con customerID pari a 1. La query XPath specifica il prefisso dello spazio dei nomi per l'elemento nella query e non per l'attributo . Gli attributi locali non sono qualificati, come specificato nello schema.Il percorso della directory specificato per lo schema di mapping (
targetNamespace.xml
) è relativo alla directory in cui viene salvato il modello. È possibile specificare anche un percorso assoluto, ad esempio:mapping-schema="C:\MyDir\targetNamepsace.xml"
Creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire il modello.
Per altre informazioni, vedere Uso di ADO per eseguire query SQLXML 4.0.
Se lo schema specifica elementFormDefault
e attributeFormDefault
gli attributi con valore "qualified"
, il documento dell'istanza include tutti gli elementi e gli attributi locali qualificati. È possibile modificare lo schema precedente in modo da includere questi attributi nell'elemento <xsd:schema>
ed eseguire di nuovo il modello. Poiché gli attributi sono ora qualificati anche nell'istanza, la query XPath cambia per includere il prefisso dello spazio dei nomi.
La query XPath modificata è:
/CO:Customer[@CO:CustomerID=1]
Di seguito è riportato il documento XML restituito:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<y0:Customer xmlns:y0="urn:MyNamespace" CustomerID="1" SalesPersonID="280">
<Order SalesOrderID="43860" CustomerID="1" />
<Order SalesOrderID="44501" CustomerID="1" />
<Order SalesOrderID="45283" CustomerID="1" />
<Order SalesOrderID="46042" CustomerID="1" />
</y0:Customer>
</ROOT>