Delen via


Metaproperties opgeven in OPENXML

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Metaproperty-kenmerken in een XML-document zijn kenmerken die de eigenschappen van een XML-item beschrijven, zoals element, kenmerk of een ander DOM-knooppunt. Deze kenmerken bestaan niet fysiek in de XML-documenttekst. OPENXML biedt echter deze metaproperties voor alle XML-items. Met deze metaproperties kunt u informatie extraheren, zoals lokale positionerings- en naamruimtegegevens, van XML-knooppunten. Deze informatie geeft u meer details dan duidelijk is in de tekstweergave.

U kunt deze metaproperties toewijzen aan de rijensetkolommen in een OPENXML-instructie met behulp van de parameter ColPattern. De kolommen bevatten de waarden van de metaproperties waaraan ze zijn toegewezen. Zie OPENXML (Transact-SQL)voor meer informatie over de syntaxis van OPENXML.

Voor toegang tot de metaproperty-kenmerken wordt een naamruimte opgegeven die specifiek is voor SQL Server. Met deze naamruimte heeft urn:schemas-microsoft-com:xml-metaprop de gebruiker toegang tot de metaproperty-kenmerken. Als het resultaat van een OPENXML-query wordt geretourneerd in een edge-tabelindeling, bevat de randtabel één kolom voor elk metapropertykenmerk, met uitzondering van de xmltext metaproperty.

Sommige metaproperty-kenmerken worden gebruikt voor verwerkingsdoeleinden. Het kenmerk xmltext metaproperty wordt bijvoorbeeld gebruikt voor overloopafhandeling. Overflowverwerking verwijst naar de onverteerde, niet-verwerkte gegevens in het document. Een van de kolommen in de rijenset die door OPENXML wordt gegenereerd, kan worden geïdentificeerd als de overloopkolom. U doet dit door deze toe te stellen aan de xmltext metaproperty met behulp van de parameter ColPattern. De kolom ontvangt vervolgens de overloopgegevens. De vlag parameter bepaalt of de kolom alles bevat of uitsluitend de onverteerde gegevens.

De volgende tabel bevat de metaproperty-kenmerken die elk geparseerd XML-element bezit. Deze metaproperty-kenmerken kunnen worden geopend met behulp van de naamruimte urn:schemas-microsoft-com:xml-metaprop. Elke waarde die de gebruiker rechtstreeks in het XML-document instelt met behulp van deze metaproperties, wordt genegeerd.

Notitie

U kunt niet verwijzen naar deze metaproperties in een XPath-navigatie.

Metaproperty-kenmerk Beschrijving
@mp:id Biedt een door het systeem gegenereerde, documentbrede id van het DOM-knooppunt. Zolang het document niet opnieuw wordt geparseerd, verwijst deze id naar hetzelfde XML-knooppunt.

Een XML-id van 0 geeft aan dat het element een hoofdelement is. De bovenliggende XML-ID is NULL.
@mp:localname Slaat het lokale deel van de naam van het knooppunt op. Deze wordt gebruikt met een voorvoegsel en een naamruimte-URI om het element of kenmerkknooppunten een naam te geven.
@mp:namespaceuri Biedt de naamruimte-URI van het huidige element. Als de waarde van dit kenmerk NULL is, is er geen naamruimte aanwezig
@mp:prefix Slaat het naamruimtevoorvoegsel van de naam van het huidige element op.

Als er geen voorvoegsel aanwezig is (NULL) en er een URI wordt opgegeven, geeft dit aan dat de opgegeven naamruimte de standaardnaamruimte is. Als er geen URI wordt opgegeven, wordt er geen naamruimte gekoppeld.
@mp:prev Slaat het vorige sibling ten opzichte van een knooppunt op. Dit bevat informatie over de volgorde van elementen in het document.

@mp:prev bevat de XML ID van het vorige broertje dat hetzelfde bovenliggende element heeft. Als een element zich aan de voorzijde van de lijst met broers en zussen bevindt, is @mp:prev NULL.
@mp:xmltext Wordt gebruikt voor verwerkingsdoeleinden. Het is de tekstuele serialisatie van het element en de bijbehorende kenmerken, en ook de subelementen, zoals wordt gebruikt in de overloopafhandeling van OPENXML.

In deze tabel ziet u de aanvullende bovenliggende eigenschappen die worden opgegeven en waarmee u informatie over de hiërarchie kunt ophalen.

Bovenliggende metaproperty-eigenschap Beschrijving
@mp:parentid Komt overeen met ../\@mp:id
@mp:parentlocalname Komt overeen met ../\@mp:localname
@mp:parentnamespacerui Komt overeen met ../\@mp:namespaceuri
@mp:parentprefix Komt overeen met ../\@mp:prefix

Voorbeelden

In de volgende voorbeelden ziet u hoe OPENXML wordt gebruikt om verschillende rijensetweergaven te maken.

Een. De OPENXML-rijensetkolommen toewijzen aan de metaproperties

In dit voorbeeld wordt OPENXML gebruikt om een rijsetweergave van het XML-voorbeelddocument te maken. In het bijzonder ziet u hoe de verschillende metaproperty-kenmerken kunnen worden toegewezen aan rijensetkolommen in een OPENXML-instructie met behulp van de parameter ColPattern.

De OPENXML-instructie illustreert het volgende:

  • De kolom id is toegewezen aan het kenmerk @mp:id metaproperty en geeft aan dat de kolom de door het systeem gegenereerde unieke XML-id van het element bevat.

  • De kolom parent is toegewezen aan @mp:parentid en geeft aan dat de kolom de XML-id van het bovenliggende element bevat.

  • De kolom parentLocalName is toegewezen aan @mp:parentlocalname en geeft aan dat de kolom de lokale naam van de bovenliggende ouder bevat.

De SELECT-instructie retourneert vervolgens de rijenset die wordt geleverd door OPENXML:

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- Sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (id int '@mp:id',
            oid char(5),
            date datetime,
            amount real,
            parentIDNo int '@mp:parentid',
            parentLocalName varchar(40) '@mp:parentlocalname');
EXEC sp_xml_removedocument @idoc;

Dit is het resultaat:

id   oid         date                amount    parentIDNo  parentLocalName
--- ------- ---------------------- ---------- ------------ ---------------
6    O1    1996-01-20 00:00:00.000     3.5         2        Customer
10   O2    1997-04-30 00:00:00.000     13.4        2        Customer
19   O3    1999-07-14 00:00:00.000     100.0       15       Customer
25   O4    1996-01-20 00:00:00.000     10000.0     15       Customer

B. Het hele XML-document ophalen

In dit voorbeeld wordt OPENXML gebruikt om een rijsetweergave met één kolom van het XML-voorbeelddocument te maken. Deze kolom, Col1, wordt toegewezen aan de xmltext metaproperty en wordt een overloopkolom. Als gevolg hiervan ontvangt de kolom de niet-verwerkte gegevens. In dit geval is dit het hele document.

De SELECT-instructie retourneert vervolgens de volledige rijenset.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
SET @doc = N'<?xml version="1.0"?>
<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
             satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
             white red">
     <MyTag>Testing to see if all the subelements are returned</MyTag>
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/')
   WITH (Col1 ntext '@mp:xmltext')

Als u het hele document wilt ophalen zonder de XML-declaratie, kan de query worden opgegeven zoals wordt weergegeven in het volgende:

SELECT *
FROM OPENXML (@idoc, '/root')
   WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc;

De query retourneert het hoofdelement met de naam root en de gegevens die in het hoofdelement zijn opgenomen.

C. De xmltext-metaproperty opgeven om de niet-verwerkte gegevens in een kolom op te halen

In dit voorbeeld wordt OPENXML gebruikt om een rijsetweergave van het XML-voorbeelddocument te maken. In het voorbeeld ziet u hoe u niet-verwerkte XML-gegevens ophaalt door het kenmerk xmltext metaproperty toe te wijst aan een rijsetkolom in OPENXML.

De comment kolom wordt geïdentificeerd als de overloopkolom door deze te koppelen aan de @mp:xmltext metaproperty. De vlaggen parameter is ingesteld op 9 (XML_ATTRIBUTE en XML_NOCOPY). Dit geeft de attribute-centric-toewijzing aan en geeft aan dat alleen de onverwerkte gegevens moeten worden gekopieerd naar de overloopkolom.

De SELECT-instructie retourneert vervolgens de rijenset die is opgegeven door OPENXML.

In dit voorbeeld wordt de @mp:parentlocalname metaproperty ingesteld voor een kolom, ParentLocalName, in de rijenset die is gegenereerd door OPENXML. Als gevolg hiervan bevat deze kolom de lokale naam van het bovenliggende element.

Er worden twee extra kolommen opgegeven in de rijenset, parent en comment. De kolom parent is toegewezen aan @mp:parentid en geeft aan dat de kolom de XML-id van het bovenliggende element van het element bevat. De kolom met opmerkingen wordt geïdentificeerd als de overloopkolom door deze toe te brengen aan de @mp:xmltext metaproperty.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>
';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (oid char(5),
            date datetime,
            comment ntext '@mp:xmltext');
EXEC sp_xml_removedocument @idoc;

Dit is het resultaat. Omdat de oid-kolommen en datumkolommen al worden gebruikt, worden ze niet weergegeven in de overloopkolom.

oid   date                        comment
----- --------------------------- ----------------------------------------
O1    1996-01-20 00:00:00.000     <Order amount="3.5"/>
O2    1997-04-30 00:00:00.000     <Order amount="13.4">Customer was very
                                   satisfied</Order>
O3    1999-07-14 00:00:00.000     <Order amount="100" note="Wrap it blue
                                   white red"><Urgency>
                                   Important</Urgency></Order>
O4    1996-01-20 00:00:00.000     <Order amount="10000"/>

Zie ook

  • OPENXML (Transact-SQL)
  • OPENXML (SQL Server)